【问题标题】:Django SelectDateWidget not saving dateDjango SelectDateWidget 不保存日期
【发布时间】:2012-02-03 07:11:26
【问题描述】:

我正在使用带有 django-registration 的 SelectDateWidget 在注册时保存出生日期。我尝试排除生日,并使用额外数据创建并保存配置文件。我不太确定哪里出了问题。

models.py

class Profile(models.Model):
    ...
    dob = models.DateField(_('birthday'))

forms.py

from django.forms.extras.widgets import SelectDateWidget

class ProfileRegistration(RegistrationFormTermsOfService):
    ...
    dob = forms.DateField(widget=SelectDateWidget(years=range(1999,1939,-1)),
                          label=_("Birthday"),
                          )

prifilebackend.py

from registration.forms import RegistrationForm
from registration.models import RegistrationProfile

    ...
    class Backend(default.DefaultBackend):
        ...
        p = Profile.objects.get(user=new_user)
        p.dob=kwargs['dob']
        p.save()

我在注册用户时遇到的错误是:profile_profile.dob may not be NULL

post数据生成dob_day、dob_month和dob_year。我试图清理数据但无济于事。任何帮助将不胜感激。

已解决:

profilebackend.py

signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)

        u = User.objects.get(username=new_user.username)
        u.first_name = kwargs['first_name']
        u.last_name = kwargs['last_name']

        gender = kwargs['gender']
        dob = kwargs['dob']

        p = Profile(user = new_user, gender = gender, dob = dob)
        p.save()
        u.save()

【问题讨论】:

    标签: django django-registration


    【解决方案1】:

    如果表单没有错误,来自bound form 实例的cleaned data 应该包含正确的日期对象。

    使用此日期对象将其分配给p.dob

    我不太明白你是如何处理你的注册表单的,但总的来说它是这样工作的:用户提交表单后,你创建一个绑定表单,确保它是有效的,然后访问清理后的表单数据。像这样的:

    # forms.py
    ...
    class RegistrationForm(forms.Form):
        ...
        dob = forms.DateField(widget=widgets.SelectDateWidget())
    
    # views.py
    ...
    def myform_view(request):
        ...
        if request.POST:
            form = RegistrationForm(request.POST)
            if form.is_valid():
                dob = form.cleaned_data.get('dob')
                # dob is now a python date object
                do_something_with_birthday(dob)
    

    如果 dob 日期对象仍然是 None 或在尝试使用后端保存它时为空,我建议您开始调试代码。您可以安装django_extensions 并使用./manage.py runserver_plus 运行开发服务器,以获得此异常的良好交互式堆栈跟踪。或者,您也可以调试您的code with pdb

    【讨论】:

    • 我正在使用自定义后端,并且能够保存名字和姓氏。以下内容:我的forms.py中的def clean_dob(self): dob = self.cleaned_data.get('dob') print dob在错误发生之前以正确的格式打印日期。还是这样解决。
    • 请看我回答末尾的调试说明。
    • 非常感谢您在后端保存的建议。我的解决方案见上文。我试图避免自定义视图。我没有看到任何理由。
    猜你喜欢
    • 2010-12-06
    • 2016-12-20
    • 2013-03-27
    • 1970-01-01
    • 2012-02-01
    • 2016-05-06
    • 1970-01-01
    • 2012-09-13
    • 2011-06-15
    相关资源
    最近更新 更多