2012-01-05 49 views
5

登録時に生年月日を保存するには、django登録でSelectDateWidgetを使用しています。私は誕生日を除外しようとしましたが、プロファイルが作成され、余分なデータで保存されました。私はすべてが間違っていてどこがうまくいかないのかよくわからない。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 datap.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を保存できました。 'def clean_dob(self):\t \t dob = self.cleaned_data.get( 'dob') \t \t私のforms.pyのprint dob'は、エラーが発生する前に正しい形式で日付を表示します。それでも解決。 –

+0

私の答えの最後にあるデバッグノートを参照してください。 – Haes

+0

あなたのアドバイスをしてくれてありがとう、バックエンドで貯金をしました。上記の私の解決策を参照してください。私はビューをカスタマイズすることを避けようとしていました。私は何か理由を見なかった。 –

関連する問題