/ / IntegrityError: NOT NULL obmedzenia zlyhalo: core_userprofile.user_id - python, django, django-modely, django-formy, django-pohľady

IntegrityError: obmedzenie NOT NULL zlyhalo: core_userprofile.user_id - python, django, django-models, django-forms, django-views

Snažím sa urobiť jednoduchú registračnú / prihlasovaciu stránkucez django. Použil som UserCreationForm a použil som model UserProfile na rozšírenie tohto užívateľského modelu. Keď som sa pokúsil uložiť žiadosť o registráciu po registrácii, došlo k chybe integrity. Som novým djangom, takže by sme uvítali stručné vysvetlenie. Vopred ďakujem

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from mysite.core.models import UserProfile
from django.db import models

class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=30, required=False, help_text="Optional.")
department = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30, required=False, help_text="Optional.")
email = forms.EmailField(max_length=254, help_text="Required. Inform a valid email address.")

class Meta:
model = User
fields = ("username", "first_name", "last_name", "email","password1", "password2", "department",)

def save(self, commit=True):
# Save the provided password in hashed format
user = super(SignUpForm, self).save(commit=False)
user_profile = UserProfile(user=user, department=self.cleaned_data["department"])
user.save()
user_profile.save()
return user, user_profile

views.py

from django.contrib.auth.decorators import login_required
from django.contrib.auth import login, authenticate
from django.shortcuts import render, redirect
from mysite.core.forms import SignUpForm

@login_required
def home(request):
return render(request, "home.html")

def signup(request):
if request.method == "POST":
form = SignUpForm(request.POST)
if form.is_valid():
user,user_profile = form.save(commit=False)
username = user.cleaned_data.get("username")
raw_password = user.cleaned_data.get("password1")
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect("home")
else:
form = SignUpForm()
return render(request, "signup.html", {"form": form})

models.py

from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,unique=True)
department = models.CharField(max_length=500, blank=True)

odpovede:

0 pre odpoveď č. 1

Musíte uložiť user predtým, ako ju priradíte k užívateľskému profilu.

user = super(SignUpForm, self).save(commit=False)
user.save()
user_profile = UserProfile(user=user, department=self.cleaned_data["department"])

Vytvorenie user a user_profile vo forme "s save() metóda je trochu mätúca. Vaša metóda už nerešpektuje commit flag, pretože vždy ukladá používateľa a užívateľský profil. Bolo by lepšie presunúť kód, ktorý vytvára profil, do if form.is_valid() blok v zobrazení.