簡體   English   中英

Django 使用信號保存用戶和配置文件

[英]Django save user and profile with signals

我仍在學習 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 字段最初為空,只需在除 user 之外的每個模型字段中添加blank=True

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

然后運行 ​​makemigrations 和 migrate 命令以成功在數據庫中進行更改。

它將解決 NOT NULL 約束失敗錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM