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ď č. 1Musí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í.