python - Django用信号保存用户和个人资料
问题描述
我还在学习 Django,我被困在用户注册/个人资料创建上。
我的目标
因此,这样做的目的是保存新用户,同时使用表单中的数据保存新用户的个人资料。我使用 2 种形式 u_form 和 p_form。
到目前为止我做了什么:
- 使用 OneToOneField 为用户创建模型配置文件
- 为用户 (u_form) 和配置文件 (p_form) 创建了 2 个表单
- 创建了 signals.py 以在创建新用户时创建新的配置文件
- 在视图中,我使用 u_form.save() 创建函数
问题
这可行,但新的配置文件完全是空的。当我将 p_form.save() 放在我的视图中时,它给了我这个错误:
NOT NULL 约束失败
编码
模型.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
voorletter = models.CharField(max_length=10)
voorvoegsel = models.CharField(max_length=10)
achternaam = models.CharField(max_length=200)
depers = models.CharField(max_length=25)
depersoud = models.CharField(max_length=25)
telefoonnummer = models.CharField(max_length=25)
class Meta:
verbose_name = "Collega"
verbose_name_plural = "Collega's"
def __str__(self):
return self.depers
信号.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
视图.py
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from gebruikers.forms import UserRegisterForm, ProfileRegisterForm
def gebruiker_create(request):
if request.method == "POST":
u_form = UserRegisterForm(request.POST)
p_form = ProfileRegisterForm(request.POST)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
messages.success(request, f'Account is aangemaakt.')
return redirect('login')
else:
u_form = UserRegisterForm()
p_form = ProfileRegisterForm()
context = {
'u_form': u_form,
'p_form': p_form
}
return render(request, 'users/register.html', context)
表格.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import Profile
class UserRegisterForm(UserCreationForm):
email = forms.EmailField(label = "Email")
password1 = forms.CharField(widget=forms.TextInput(attrs={'type':'password'}), label="Wachtwoord", help_text=None)
password2 = forms.CharField(widget=forms.TextInput(attrs={'type':'password'}), label="Wachtwoord herhalen", help_text=None)
class Meta:
model = User
fields= ['username', 'email', 'password1', 'password2']
class ProfileRegisterForm(forms.ModelForm):
voorletters = forms.CharField(label="Voorletters", max_length=10)
voorvoegsel = forms.CharField(label="Voorvoegsel", max_length=50)
achternaam = forms.CharField(label='Achternaam', max_length=100)
depers = forms.CharField(label='Depers', max_length=8)
depersoud = forms.CharField(label='Oude Depers', max_length=50)
telnummer = forms.CharField(label="Telefoonnummer", max_length=20)
class Meta:
model = Profile
fields = ['voorletters', 'voorvoegsel', 'achternaam', 'depers', 'depersoud', 'telnummer']
解决方案
如果您希望 Profile 字段最初为空,只需添加blank=True
除 user 之外的每个模型字段。
voorletter = models.CharField(max_length=10, blank=True)
.....
.....
.....
telefoonnummer = models.CharField(max_length=25, blank=True)
然后运行 makemigrations 和 migrate 命令以成功在数据库中进行更改。
它将解决 NOT NULL 约束失败错误
推荐阅读
- javascript - 获取请求返回 NetworkError
- vb.net - 如何绑定并显示多折线图形成?
- javascript - 我可以在 package.json 中插入用户消息吗?
- jquery - Select2 v4 和 Bootstrap v4 - 缺少下拉菜单
- python - 在熊猫数据框中计算点之间最短(欧几里得)距离的最快方法
- c - C rand() 的问题
- visual-studio-code - 在 tasks.json 中使用“命令”类型的输入
- c# - 如何在 C# 中生成 .proto 文件或使用“Code First gRPC”
- c# - 无法打开第二个表格
- java - 如何将变量保存在循环中以便以后再次使用?