djangodjango-modelsdjango-formsdjango-viewsdjango-widget

Django 1.4 Want to make birthdate field utilizing SelectDateWidget not required on my form


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?


Solution

  • 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.