我与 Django 用户模型和自定义配置文件模型具有一对一的关系。我尝试在用户注册时同时保存用户和个人资料数据。但问题是配置文件模型的数据未验证且数据未保存在数据库中 这是代码
model.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
picture = models.ImageField(upload_to = 'profile_pictures')
Join_as = models.CharField(choices=USER_CHOICES, max_length=70)
date = models.DateField(auto_now_add=True)
form.py
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['picture','Join_as']
labels = {
'picture':'Upload Profile Picture'
}
widgets = {
'Join_as':forms.Select(attrs={'class':'form-select'}),
}
view.py
def register(request):
if request.method == 'POST':
user_form = UserCreationForm(request.POST)
profile_form = ProfileForm(request.POST, request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
return HttpResponseRedirect('/')
else:
user_form = UserCreationForm()
profile_form = ProfileForm()
context = {'user_form':user_form,'profile_form':profile_form}
return render(request, 'registration/register.html', context)
register.html
<form action="" method="POST" enctype='multipart/form-data'>
{% csrf_token %}
<div class="row row-cols-2">
{% for user in user_form %}
<div class="col">
{{user.label_tag}} {{user}} {{user.errors|striptags}}
</div>
{% endfor %}
{% for profile in profile_form %}
<div class="col">
{{profile.label_tag}} {{profile}} {{profile|striptags}}
</div>
{% endfor %}
</div>
<input type="submit" value="Register" class="btn btn-success">
</form>
问题出在保存表单数据的方式上。当你调用
profile_form.save()
时,它并不知道与哪个用户关联。
以下是修改后的
view.py
中的
register
函数,它展示了如何正确保存用户和配置文件数据:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from .forms import ProfileForm
def register(request):
if request.method == 'POST':
user_form = UserCreationForm(request.POST)
profile_form = ProfileForm(request.POST, request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save() # 保存用户
profile = profile_form.save(commit=False) # 创建配置文件实例,但不保存
profile.user = user # 将用户关联到配置文件
profile.save() # 保存配置文件
return redirect('/') # 重定向到主页或登录页面
else:
user_form = UserCreationForm()
profile_form = ProfileForm()
context = {'user_form': user_form, 'profile_form': profile_form}
return render(request, 'registration/register.html', context)
关键变化:
-
user = user_form.save()
: 我们首先保存用户表单,这将创建一个新的用户对象并返回它。 -
profile = profile_form.save(commit=False)
: 我们调用profile_form.save()
,但传入commit=False
。 这将创建一个配置文件实例,但不会立即将其保存到数据库中。 -
profile.user = user
: 我们将保存的用户对象分配给配置文件实例的user
字段。 -
profile.save()
: 最后,我们调用profile.save()
将配置文件实例(现在已与用户关联)保存到数据库中。
通过这些更改,的注册视图现在应该能够正确创建用户并同时保存其配置文件信息。
标签:python,django From: 66723586