无法在用户注册后立即为我的用户配置文件创建外键关系
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()
完成你想做的事情。
我正在尝试将用户注册表单提交到两个模型(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()
完成你想做的事情。