/ / IntegrityError: NO ha fallado la restricción NULL: core_userprofile.user_id - python, django, django-models, django-forms, django-views

IntegrityError: NO ha fallado la restricción NULL: core_userprofile.user_id - python, django, django-models, django-forms, django-views

Estoy tratando de hacer una simple página de registro / inicio de sesióna través de django. He utilizado UserCreationForm y he utilizado un UserProfile modelo para ampliar el modelo de usuario. Cuando intenté guardar la solicitud de registro posterior a la publicación, está dando el error de integridad. Soy nuevo en django por lo que se agradecería una breve explicación. Gracias por adelantado

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)

Respuestas

0 para la respuesta № 1

Debe guardar el user antes de asignarlo al perfil de usuario.

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

Creando el user y user_profile en la forma s save() El método es un poco confuso. Tu método ya no respeta el commit marca ya que siempre guarda el usuario y el perfil del usuario. Sería mejor mover el código que crea el perfil en el if form.is_valid() Bloque en la vista.