【问题标题】:Django 1.4 Want to make birthdate field utilizing SelectDateWidget not required on my formDjango 1.4 想要使用 SelectDateWidget 在我的表单中创建出生日期字段
【发布时间】:2012-06-08 22:08:35
【问题描述】:

我正在尝试为用户创建一个表单以自行更改其个人资料帐户信息。目前我有它,所以他们可以更新他们的第一个、最后一个和用户名、性别和“生日”。 “生日”是唯一一个我不能不需要的。目前,我的表单检查是否在任何表单字段中都没有输入,如果没有进行任何更改,则不会更新用户信息。

~~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)

--收集用户设置更改的表单

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))

有没有办法让使用 SelectDateWidget() 时不需要出生日期字段,因为我当前的 required = False 尝试不起作用。或者可能是允许用户编辑其设置并提交更改的更好方法?

提前致谢。

【问题讨论】:

    标签: django django-models django-forms django-views django-widget


    【解决方案1】:

    我预计您的问题源于以下事实:

    settingForm.cleaned_data.get('birthdate')
    

    不会返回 None,但会给你一个空字符串 '',这不是 Date 或 DateTime 字段所期望的。

    如果用户实际上没有选择日期,您应该返回 NoneType。

    【讨论】:

    • 哦,我明白了。那么有没有更好的方法来保存生日变量呢?如果我做了这样的检查: -------------------------- if request.POST['birthdate'] == '': settingForm.birthdate = 无------------------------------------------------ ---------------------- 或者没有清理数据的效果?我对 django 和 python 还是有点陌生​​,所以处理这些事情与我的 C++ 类略有不同。谢谢。
    • 你可以为一个字典get方法声明你自己的返回类型,例如dict.get('foo', None) ''只是一个默认值
    • 我已经尝试在 django 文档中查找如何执行此操作。我不太确定是否应该在视图或视图调用的实际表单中编写自定义返回。似乎在表单中声明它是正确的选择,但我想检查一下,因为我以前从未这样做过。
    • 在你的表单中,添加一个 def clean_birthday(self),所有字段都检查自定义的 clean 方法,然后整个 clean 方法被交叉
    猜你喜欢
    • 2010-10-23
    • 2017-12-22
    • 2016-12-20
    • 2010-12-06
    • 2012-04-20
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多