【问题标题】:Django save user and profile with signalsDjango用信号保存用户和个人资料
【发布时间】:2020-10-22 10:46:58
【问题描述】:

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

我的目标

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

到目前为止我做了什么:

  • 使用 OneToOneField 为用户创建模型配置文件
  • 为用户 (u_form) 和配置文件 (p_form) 创建了 2 个表单
  • 创建了 signals.py 以在创建新用户时创建新配置文件
  • 在视图中我使用 u_form.save() 创建函数

问题

这可行,但新的个人资料完全是空的。当我将 p_form.save() 放在我的视图中时,它给了我这个错误:

NOT NULL 约束失败

代码

models.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()

views.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)

forms.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']

【问题讨论】:

    标签: python django signals profile


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答!问题是它在 user_id 上给出了 NOT NULL 约束失败
    猜你喜欢
    • 2023-03-22
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多