0

我的意图是使用Django的User模型和UserProfile模型(基本上添加有关用户的详细信息/字段)创建用户配置文件。然后,我想创建一个注册表单,要求填写用户模型和UserProfile模型中包含的字段(即,来自两个模型的字段的单个表单)。如何在Django中的UserProfile的后端/数据库中保存数据

现在发生的事情是将必要的数据输入到我的表单后,视图通过,服务器创建一个User对象,甚至将其链接到一个UserProfile对象(据我所知,这种关联是因为信号在models.py类中创建)。然而,没有关于UserProfile的信息(在这种情况下,“位置”字段)被添加,并且对于我的生活,我无法弄清楚为什么。

我有以下models.py

class UserProfile(models.Model): 
    # This field is required. 
    user = models.ForeignKey(User, unique=True, related_name="connector") 
    location = models.CharField(max_length=20, blank=True, null=True) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     UserProfile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

我有以下forms.py(其中用户窗体是基于由Django的定义的用户模型)

class UserForm(ModelForm): 
    class Meta: 
     model = User 

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 

我有以下的观点的.py

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form1 = UserForm(request.POST) 
     form2 = UserProfileForm(request.POST) 
     if form1.is_valid() and form2.is_valid(): 
      #create initial entry for user 
      username = form1.cleaned_data["username"] 
      password = form1.cleaned_data["password"] 
      new_user = User.objects.create_user(username, password) 
      new_user.save() 

      #create entry for UserProfile (extension of new_user object)  
      profile = form2.save(commit = False) 
      profile.user = new_user 
      profile.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form1 = UserForm() 
     form2 = UserProfileForm() 
    c = { 
     'form1':form1, 
     'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 

我有以下register.html

<form action="/accounts/register/" method="post">{% csrf_token %} 
    <p style="color:red"> {{form.username.errors}}</p> 
    {{ form1.as_p }} 
    {{ form2.as_p }} 
    <input type="submit" value="Create the account"> 
</form> 

任何人都可以看到我做错了什么吗?有一个更好的方法吗?提前致谢!

回答

0

在我看来,没有必要使用django信号。

如果你给我完整的项目源(如果可能的话)我会解决您的问题

不建议您使用某种形式嵌入两个独立的形式方法,它是不漂亮。但如果你说你测试过的数据是正确的,请首先尝试下面的代码。

我改变了保存用户和userprofile对象的方式。提醒我。

删除信号从型号:

class UserProfile(models.Model): 
     user = models.ForeignKey(User, unique=True, related_name="connector") 
     location = models.CharField(max_length=20, blank=True, null=True) 

和浏览次数:

@csrf_protect 
def register(request): 
     if request.method == 'POST': 
      form1 = UserForm(request.POST) 
      form2 = UserProfileForm(request.POST) 
      if form1.is_valid() and form2.is_valid(): 
       #create initial entry for user 
       username = form1.cleaned_data["username"] 
       password = form1.cleaned_data["password"] 
       new_user = User() 
       new_user.username = username 
       new_user.set_password(password) 
       new_user.save() 

       profile = UserProfile() 
       profile.user = new_user 
       profile.save() 
       return HttpResponseRedirect("/books/") 
     else: 
      form1 = UserForm() 
      form2 = UserProfileForm() 
     c = { 
       'form1':form1, 
       'form2':form2, 
       } 
     c.update(csrf(request)) 
     return render_to_response("registration/register.html", c) 
+0

POST数据包含这些变量的值。你在问什么? – goelv 2012-08-12 15:49:58

+0

此外,注册页面现在要求我选择一个用户以验证(对于表单2)。然而,这个用户是我试图通过表单创建的用户(即它没有创建年份)。我可以设置唯一的可选外键吗? – goelv 2012-08-12 16:01:40

+0

可选且唯一。这些都是悖论。请尝试我的上述代码并通知我 – Bartanix 2012-08-18 23:11:18

0

由于要保存在视图中的配置文件,你不需要post_save信号。可能会被覆盖。

1

你的问题是因为你在一个<form></form> 你需要使用prefix有多种形式,让你的代码看起来是这样的:

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form1 = UserForm(request.POST, prefix = "user") 
     form2 = UserProfileForm(request.POST, prefix = "profile") 
     if form1.is_valid() and form2.is_valid(): 
      #create initial entry for user 
      username = form1.cleaned_data["username"] 
      password = form1.cleaned_data["password"] 
      new_user = User.objects.create_user(username, password) 
      new_user.save() 

      #create entry for UserProfile (extension of new_user object)  
      profile = form2.save(commit = False) 
      profile.user = new_user 
      profile.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form1 = UserForm(prefix = "user") 
     form2 = UserProfileForm(prefix = "profile") 
    c = { 
     'form1':form1, 
     'form2':form2, 
     } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 

从UserProfileForm排除用户场使用排除

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ('user',) 

如果您手动创建配置文件,则不需要使用po st_save信号

相关问题