Django SelectDateWidget没有保存日期

Django SelectDateWidget not saving date

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

模特儿

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

表单

1
2
3
4
5
6
7
from django.forms.extras.widgets import SelectDateWidget

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

prifilebackend.py版

1
2
3
4
5
6
7
8
9
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不能为空

post数据生成dob_日、dob_月和dob_年。我试图清理数据,但没有用。如有任何帮助,我们将不胜感激。

解决了的:

简介backend.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

如果表单没有错误,则从绑定表单实例中清除的数据应包括正确的日期对象。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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_扩展并使用./manage.py runserver_plus运行一个开发服务器,以获得这个异常的一个很好的交互式堆栈跟踪。或者,也可以使用PDB调试代码。