2012-01-05 47 views
5

我正在使用SelectDateWidget和django-registration在注册时保存出生日期。我已经尝试过排除生日,并且创建了一个配置文件并与额外的数据一起保存。我不太清楚哪里一切都出错了。Django 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不得为NULL

发布数据正在生成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() 

回答

5

bound form实例应包括正确的日期对象,如果表格没有错误的cleaned data

使用该Date对象将其分配到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

+0

我正在使用自定义后端,我已经能够保存first_name和last_name。以下内容:'高清clean_dob(个体经营): \t \t DOB = self.cleaned_data.get( 'DOB') \t \t打印dob'在我forms.py是打印日期以正确的格式错误发生之前。仍然如此解决。 – 2012-01-06 02:53:27

+0

请在我的答案最后看到调试笔记。 – Haes 2012-01-06 09:19:57

+0

非常感谢你的建议,在后端保存了窍门。请参阅上面的解决方案。我试图避免自定义视图。我没有看到任何理由。 – 2012-01-06 16:02:07