2017-04-17 12 views
0

ユーザー(ユーザー名、電子メール、パスワード)とユーザープロファイル(名と姓)に関する情報を含むサインアップフォームとコールセーブを送信すると私のviews.pyにform.save()profileform.save()のようなものがあります。Django - 1つではなく2つのプロファイルを作成するユーザーとユーザープロファイルフォーム

しかし、私がDjango Adminに入ると、ユーザープロファイルとプロファイルが別々に保存されていることがわかります。

enter image description here

ので(画像表示装置など)は、2つの異なるプロファイル、私は、フォームに入力したユーザー名を含むもの、と最初と最後の名前を持つ他のがあります。

ここに私のviews.pyだ:

def signup(request): 
    if request.method == 'POST': 
     form = UserRegistrationForm(data=request.POST) 
     profileform = UserRegistrationProfileForm(data=request.POST) 
     if form.is_valid() and profileform.is_valid(): 
      user = form.save() 
      profileform.save() 
      if user is not None: 
       if user.is_active: 
        user_login(request, user, backend='django.contrib.auth.backends.ModelBackend') 
        return redirect('/dashboard/') 
    else: 
     form = UserRegistrationForm() 
     profileform = UserRegistrationProfileForm() 
    return render(request, 'signup-user.html', {'form': form, 'profileform': profileform}) 

Forms.py(フォームの輪郭部分のため):

class UserRegistrationProfileForm(forms.ModelForm): 
    user_fname = forms.CharField(#) 
    user_lname = forms.CharField(#) 

    class Meta: 
     model = UserProfileModel 
     fields = ['user_fname', 'user_lname'] 

    def clean(self): 
     #... 

    def save(self, commit=True): 
     profile = super(UserRegistrationProfileForm, self).save(commit=False) 
     if commit: 
      profile.save() 
     return profile 

Models.py(受信信号を含むプロファイルのため):

class UserProfileModel(models.Model): # For the Company Employees 
    user = models.OneToOneField(UserModel, related_name='userprofilemodel', on_delete=models.CASCADE, blank=True, null=True) 
    user_fname = models.CharField(max_length=30, verbose_name='First Names') 
    user_lname = models.CharField(max_length=30, verbose_name='Last Name') 

    class Meta: 
     verbose_name = 'Profile' 

    def __unicode__(self): 
     #... 

    def save(self, *args, **kwargs): 
     super(UserProfileModel, self).save(*args, **kwargs) 

    @receiver(post_save, sender=UserModel) 
    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      UserProfileModel.objects.create(user=instance) 

    @receiver(post_save, sender=UserModel) 
    def save_user_profile(sender, instance, **kwargs): 
     instance.userprofilemodel.save() 

何が間違っているのか分かりませんか?私は、フォームとして、ユーザとしてのユーザインスタンスと、姓と名を持つ1つのユーザプロファイルを作成します。

どこが間違っているのでしょうか?

更新

ここUserRegistrationFormクラスです:

class UserRegistrationForm(forms.ModelForm): 
    # 

    class Meta: 
     model = UserModel 
     fields = ['related_company_slug', 'username', 'user_email', 'password', 'passwordrepeat'] 

    def clean(self): 
     # 

    def save(self, commit=True): 
     self.check_company 
     user = super(UserRegistrationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data.get('password')) 
     user.is_active = True 
     if commit: 
      user.save() 
     return user 
+0

'UserRegistrationForm'クラスを見ることはできますか? –

+0

私の質問を更新しました@MattCremeens – jayt

答えて

1

あなたはそれらの信号を取り除く必要があります。彼らは何も役に立たず、おそらく重複の原因になります。

user = form.save() 
profile = profileform.save(commit=False) 
profile.user = user 
profile.save() 

ます。また、フォームとの両方に保存する方法を取り除く必要があります。

は代わりに、あなたが作成しているプロファイルが作成したばかりのユーザーに属していることを形に伝えるために何かをする必要がありこのモデルでは、superメソッドを呼び出す唯一のアクションを持つオーバーライドされたメソッドを定義することに意味がありません。

同様に、user is not Noneuser.is_activeのチェックを取り除くことができます。ユーザーを作成したばかりなので、そのユーザーは存在し、アクティブであることがわかります。

+0

私のプロファイルフォームにはユーザーフィールドがありません。 – jayt

+0

私はあなたのコメントを理解していません。あなたのフォームにユーザフィールドがあるとは思わなかった。このコードをそのまま使用してください。 –

+0

素晴らしいです、ありがとうございます!信号が問題であったことが分かります。 – jayt

0

実際には、imoは、各ユーザーのプロファイルを持つことをお勧めします。このポスト/セーブ・セーブ・シグナルを達成するには、使用するシグナルが理にかなっています。ユーザーは単にシステムに登録たとえば、新しいユーザーのプロファイルは、コードは非常に簡単になります を自動作成されます:あなたは既にプロファイルなしでユーザーのプールがあり、それらのプロファイルを作成したい場合は、

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    # your fields 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

また、あなたこのようなデータ移行のためのコードが必要な場合は、データ移行を使用できます。post in my blogを参照してください。

+1

そのサイトに所属していることをお知らせください – Riker

+0

@Riker私はこのサイトの所有者です。 –

+2

有用な限りリンクは許容されていますが、特にすべての投稿にリンクが含まれている場合は、同じサイト。私は、コミュニティが何を考えるかについて、[スパマーにならないでください](http://stackoverflow.com/help/promotion)を読むことをお勧めします。 –

関連する問題