2012-01-05 71 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