无法在用户注册后立即为我的用户配置文件创建外键关系

Trouble creating a ForeignKey relationship for my UserProfile immediately upon User registration

我正在尝试将用户注册表单提交到两个模型(User 和 UserProfile)中,并立即创建 UseProfile 属于用户的关系。我认为问题在于将 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>

谢谢!

我会先把你们的关系改成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)

在创建用户时创建 UserProfile 的推荐方法是使用 post_save signal (here 文档页面解释它们是什么)。

基本上发生的事情是,当创建用户模型(第一次保存)时,我们创建了一个链接到用户的 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,您最终会遇到一个 User 有多个 UserProfiles 的情况(因此您不能 user.user_profile) .

信号将在您执行 user.save() 时触发,因此您可以从那里开始执行(假设您将字段更改为 OneToOneField):

user.user_profile.interests = interests
user.user_profile.age = age
user.user_profile.save()

完成你想做的事情。