I am trying to create a form for the user to change their profile account information on their own. Currently I have it so they can update their first, last and username, gender and 'birthdate'. The 'birthdate' is the only one I can't get to be not required. Currently my form checks if no input was given in any of the forms fields and will NOT update the users information if no changes are made.
~~Models.py~~
class Account(models.Model):
user = models.OneToOneField(User) #link (pointer) to the users other information in User model
birthdate = models.DateField(blank = True, null = True) # True makes this field optional
gender = models.CharField(max_length = 10, choices = GENDER_CHOICE, null = True, blank = True)
profilePic = models.ImageField(upload_to = "profilepics/%Y/%m/%d", default = "profilepics/default.jpg", blank = True)
--Form to gather user setting changes
class EditAccountForm(forms.Form):
username = forms.CharField(max_length = 30, required = False)
first_name = forms.CharField(max_length = 30, required = False)
last_name = forms.CharField(max_length = 30, required = False)
birthdate = forms.DateField(widget = SelectDateWidget(required = False, years = range(2022, 1930, -1))) # make birthdate drop down selectable
gender = forms.CharField(max_length = 10, widget=forms.Select(choices = GENDER_CHOICE),)# null = True)
~~Views.py
def AccountSettings(request):
sluggedSettingError = request.GET.get('error', '') # error message with slugged character
settingError = sluggedSettingError.replace('-', ' ')
# form variable may need to be inside below if statement
settingForm = EditAccountForm(request.POST or None) # variable is called in edit_user.html
if request.method == 'POST':
if settingForm.is_valid():
userSettings = request.user.get_profile() # returns the current settings of the users profile
if request.POST['gender'] == '---':
print "Gender was not changed"
else:
userSettings.gender = request.POST['gender'] # add a check for birthdate submission
userSettings.birthdate = settingForm.cleaned_data.get('birthdate') # currently requires input format YYYY-mm-dd
# check if the first name submission is not changed
if request.POST['first_name'] == '':
print "First name not changed"
else:
userSettings.user.first_name = request.POST['first_name']
# check if the last name submission is not changed
if request.POST['last_name'] == '':
print "Last name not changed"
else:
userSettings.user.last_name = request.POST['last_name']
# check if the username submission is not changed
if request.POST['username'] == '':
print "Username not changed"
else:
userSettings.user.username = request.POST['username']
# check if the ProfilePicture submission is not changed
# if request.POST['profilePic'] == None:
# print "Profile picture not changed"
# else:
# userSettings.profilePic = request.POST['profilePic']
userSettings.user.save() # save the changes to the fields in used from the auth library
userSettings.save() # save the altered and unaltered settings
return HttpResponseRedirect('/')
return render_to_response("user_settings.html", {'settingForm': settingForm, 'settingError': settingError}, context_instance = RequestContext(request))
Is there a way to make the birthdate field not required whilst using the SelectDateWidget()
since my current attempt of required = False does not work. Or possibly a better method to allow the user to edit their settings and submit the changes?
I expect your problem derives from the fact that:
settingForm.cleaned_data.get('birthdate')
won't return None
but hands you an empty string ''
which isn't what the Date or DateTime field expects.
You should return a NoneType if the user hasn't actually selected a date.