2016-04-01 33 views
0

私はDjangoでカスタム作成フォームのsaveメソッドを上書きしようとしています。私は多くの属性を持つモデルUserProfileを持っています。 UserUserProfileの両方を作成して保存するUserProfileCreationFormを作成しました。今度はUserを保存しますが、を保存することはできません(チャイルドフィールドに日付を書き込むのではなく、date_of_birthという属性を上書きしました)。カスタムユーザープロファイル作成フォームの保存方法を正しく上書きする方法は?

それでは、私がしたいことは、このフォームはUserUserProfileの両方を保存したり、私がここでUserProfileCreationForm_object.save()

を行う際にエラーを発生させるようにすることですが、私のフォームです:

class UserProfileCreationForm(UserCreationForm): 
    username = forms.CharField(label="Username",max_length=40) 
    email = forms.EmailField(label="Email address", max_length=40) 
    first_name = forms.CharField(label='First name', max_length=40) 
    last_name = forms.CharField(label='Last name', max_length=40) 
    date_of_birth = forms.DateField(label='Date of birth', 
            widget=SelectDateWidget(years=[y for y in range(1930,2050)]), 
            required=False) 
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput) 

    class Meta(): 
     model = UserProfile 
     fields = ('username','email','first_name','last_name','password1','password2','date_of_birth','telephone','IBAN',) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      msg = "Passwords don't match" 
      raise forms.ValidationError("Password mismatch") 
     return password2 

    def save(self, commit=True): 
     user = User(username=self.cleaned_data['username'], 
        first_name=self.cleaned_data['first_name'], 
        last_name=self.cleaned_data['last_name'], 
        email=self.cleaned_data['email']) 
     user.save() 
     # user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     user_profile = super(self).save() 
     if commit: 
      user.save() 
      user_profile.save() 
     return user 

ことが必要である場合は、ここにありますモデル:

class UserProfile(models.Model): 
    # ATRIBUTY KTORE BUDE MAT KAZDY 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_profile') 
    iban = models.CharField(max_length=40, blank=True,verbose_name='IBAN') 
    telephone = models.CharField(max_length=40, null=True, blank=True) 

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
     ('coincidence', u'It was coincidence'), 
     ('relative_or_friends', 'From my relatives or friends'), 
    ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True, 
               blank=True) 

    MARITAL_STATUS_CHOICES = (
     ('single', 'Single'), 
     ('married', 'Married'), 
     ('separated', 'Separated'), 
     ('divorced', 'Divorced'), 
     ('widowed', 'Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True, blank=True) 

    # TRANSLATORs ATTRIBUTES 

    # jobs = models.Model(Job) 

    language_tuples = models.ManyToManyField(LanguageTuple) 

    rating = models.IntegerField(default=0) 

    number_of_ratings = models.BigIntegerField(default=0) 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

答えて

1

まず、あなたは、のようないくつかのフィールドをredifineする必要はありません。、等...ここ はsave ovrideとの完全な例です。

class RegisterForm(UserCreationForm): 
    email = forms.EmailField() 

    def __init__(self, *args, **kwargs): 
     super(RegisterForm, self).__init__(*args, **kwargs) 
     #self.error_class = BsErrorList 

    def clean_email(self): 
     email = self.cleaned_data["email"] 

     try: 
      User._default_manager.get(email__iexact=email) 
     except User.DoesNotExist: 
      return email 
     raise forms.ValidationError(
      'A user with that email already exists', 
      code='duplicate_email', 
     ) 

    def save(self, commit=True): 
     user = super(RegisterForm, self).save(commit=False) 
     user.email = self.cleaned_data["email"] 

     # Create user_profile here 

     if commit: 
      user.save() 

     return user 

編集:このソリューションで再利用DjangoのUserフォーム新しいUserを登録するには、あなたは、あなたのカスタムプロファイルを作成する必要があります。

関連する問題