2017-04-17 61 views
0

当我提交一个包含用户信息(用户名,电子邮件,密码)和用户配置文件(名字和姓氏)并呼叫保存的注册表单像我的views.py中的form.save()profileform.save()然后所有似乎都很好,我没有得到任何错误。Django - 创建两个配置文件而不是一个的用户和用户配置文件表单

但是,当我进入Django Admin时,我看到用户配置文件和配置文件已分别保存。

enter image description here

所以这是两个不同的配置文件,一个包含我在表单中输入的用户名,和其他与第一和最后一个名称(如图像显示器)。

这是我的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() 

我不知道我做错了吗?我希望表单创建一个用户配置文件,其中包含用户实例作为用户,以及名和姓。

关于我哪里出错的任何想法?

更新

这里的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() 

你也应该摆脱的形式和对保存方法模型 - 定义一个重载方法的唯一动作是调用超级方法没有意义。

同样,你可以摆脱支票user is not Noneuser.is_active;您知道用户存在且处于活动状态,因为您刚刚创建了该用户。

+0

我的个人资料表单没有用户字段,我将如何调整以适应此问题? – jayt

+0

我不明白你的意见。我没有假设你的表单有一个用户字段;您应该按原样使用此代码。 –

+0

真棒,它的作品谢谢!结果发现信号是问题。 – jayt

0

实际上,对于每个用户来说,最好总是有个人资料。为了达到这个后期/预先保存的信号,你使用的是有道理的。例如,当用户刚注册的系统,配置新的用户将被自动创建 的代码会非常简单:

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)以了解更多关于社区认为的内容 –

相关问题