首页 > 解决方案 > Django用信号保存用户和个人资料

问题描述

我还在学习 Django,我被困在用户注册/个人资料创建上。

我的目标

因此,这样做的目的是保存新用户,同时使用表单中的数据保存新用户的个人资料。我使用 2 种形式 u_form 和 p_form。

到目前为止我做了什么:

问题

这可行,但新的配置文件完全是空的。当我将 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']

标签: pythondjangosignalsprofile

解决方案


如果您希望 Profile 字段最初为空,只需添加blank=True除 user 之外的每个模型字段。

voorletter = models.CharField(max_length=10, blank=True)
.....
.....
.....
telefoonnummer = models.CharField(max_length=25, blank=True)

然后运行 ​​makemigrations 和 migrate 命令以成功在数据库中进行更改。

它将解决 NOT NULL 约束失败错误


推荐阅读