用户注册后立即为我的UserProfile创建ForeignKey关系

时间:2015-08-05 20:41:28

标签: python django django-templates

我正在尝试将用户注册表单提交到两个模型(User和UserProfile)并立即创建UseProfile属于User的关系。我认为问题是将request.user.id传递给UserProfile模型,以便它知道它属于谁。

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    age = models.CharField(max_length=100)
    interests = models.TextField(default="")
    user = models.ForeignKey(User)

views.py

from django.shortcuts import render
from django.contrib.auth.models import User
from .models import UserProfile
from django.contrib.auth import authenticate, login

def user_creation_view(request):
    if request.method == "POST":
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        user = User.objects.create_user(username=username, password=password)
        user.save()
        user = authenticate(username=username, password=password)
        login(request, user)
        interests = request.POST.get('interests', None)
        age = request.POST.get('age', None)        
        pk = request.user.id
        user_profile = UserProfile.objects.create(age=age, interests=interests, user=pk)
    return render(request, "profiles/user_creation_template.html")

user_creation_template.html

<!DOCTYPE html>
<html>
<head></head>
<body>  
<form method="post" action="{% url "user_creation" %}">
    {% csrf_token %}
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <input type="text" placeholder="Interests" name="interests">
    <input type="text" placeholder="age" name="age">
    <input type="submit">
</form>
</body>
</html>

谢谢!

2 个答案:

答案 0 :(得分:1)

在创建用户时创建UserProfile的推荐方法是使用post_save信号(here是说明内容的文档页面。)

基本上发生的是当创建用户模型(第一次保存)时,我们创建一个链接到User的UserProfile对象。像这样:

from django.contrib.auth.models import User
from django.db import models
from django.dispatch import receiver

@receiver(models.signals.post_save, sender=User)
def create_user_profile(sender, instance=None, created=False, **kwargs):
    if created:
        UserProfile.objects.get_or_create(user=instance)

注意:如果您使用ForeignKey而不是OneToOneField,那么您最终会遇到用户有多个UserProfiles的情况(因此您无法{{1} })。

当你执行user.user_profile时会触发信号,所以从那以后你可以做(​​假设你将字段改为OneToOneField):

user.save()

完成你想做的事。

答案 1 :(得分:0)

我首先要将您的关系更改为OneToOneField

class UserProfile(models.Model):
    age = models.CharField(max_length=100)
    interests = models.TextField(default="")
    user = models.OneToOneField(User)

接下来,我会发出一个post_save信号来生成新的个人资料。

django.db.models.signals import post_save

def new_user_receiver(sender, instance, created, *args, **kwargs):
    if created:         
        new_profile, is_created = UserProfile.objects.get_or_create(user=instance)

post_save.connect(new_user_receiver, sender=User)