Ограничение Django FOREIGN KEY не сработало после отправки формы
Добрый день, только изучаю Django с 3 дня. После ввода чего-либо в форму, нажатия кнопки submit, я хочу, чтобы заголовок был присвоен пользователю. Но я получаю эту ошибку:
IntegrityError at /todo/
FOREIGN KEY constraint failed
Request Method: POST
Request URL: http://localhost:8000/todo/
Django Version: 4.0.1
Exception Type: IntegrityError
Exception Value:
FOREIGN KEY constraint failed
В панели администратора форма также сохраняется и отображается выпадающий список "Автор", но ни один пользователь не назначен автором.
// models.py
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
class User(models.Model):
username = models.CharField(max_length=255)
email = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255)
def __str__(self):
return self.username
class Todos(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.title
\forms.py
from django import forms
from django.contrib.auth import get_user_model
# check for unique email & username
from .models import Todos
User = get_user_model()
class RegisterForm(forms.Form):
username = forms.CharField()
email = forms.EmailField()
password1 = forms.CharField(
label='Password',
widget=forms.PasswordInput(
attrs={
"class": "form-control",
"id": "user-password"
}
)
)
password2 = forms.CharField(
label='Confirm Password',
widget=forms.PasswordInput(
attrs={
"class": "form-control",
"id": "user-confirm-password"
}
)
)
class LoginForm(forms.Form):
username = forms.CharField(widget=forms.TextInput(
attrs={
"class": "form-control"
}))
password = forms.CharField(
widget=forms.PasswordInput(
attrs={
"class": "form-control",
"id": "user-password"
}
)
)
class TodosForm(forms.ModelForm):
class Meta:
model = Todos
fields = [
'title'
]
\views.py
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
# Create your views here.
from .forms import LoginForm, RegisterForm, TodosForm
from django.contrib.auth.models import User
User = get_user_model()
def signup_view(request):
form = RegisterForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password1")
password2 = form.cleaned_data.get("password2")
try:
user = User.objects.create_user(username, email, password)
except:
user = None
if user != None:
login(request, user)
return redirect("/todo")
else:
request.session['register_error'] = 1 # 1 == True
if request.user.is_authenticated:
return redirect("/")
return render(request, "signup.html", {"form": form})
def signin_view(request):
form = LoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
if user != None:
# user is valid and active -> is_active
# request.user == user
login(request, user)
return redirect("/")
else:
# attempt = request.session.get("attempt") or 0
# request.session['attempt'] = attempt + 1
# return redirect("/invalid-password")
request.session['invalid_user'] = 1 # 1 == True
if request.user.is_authenticated:
return redirect("/")
return render(request, "signin.html", {"form": form})
def signout_view(request):
logout(request)
# request.user == Anon User
return redirect("/signin")
@login_required
def todo_view(request):
form = TodosForm(request.POST or None)
if form.is_valid():
instance = form.save(commit=False)
instance.author = request.user
instance.save()
return render(request, "todo.html", {"form": form})
Используете ли вы пользовательскую модель пользователя? Ваша модель Todos ссылается на пользователя, settings.AUTH_USER_MODEL
для вашего поля author
, но ваша модель User, похоже, не связана с этим. Вы используете стандартную модель пользователя django или пользовательскую модель. Если вы хотите создать пользовательскую модель пользователя с email в качестве имени пользователя, проверьте https://learndjango.com/tutorials/django-custom-user-model. В противном случае, попробуйте:
author = models.ForeignKey(
User, on_delete=models.CASCADE, blank=True, null=True)
Но если эта модель пользователя, которую вы создали, не является пользовательской моделью, то я не понимаю, почему вы не можете использовать обычную модель пользователя django, как описано здесь .
Я сталкивался с подобными вопросами в течение нескольких часов, и ни один ответ не помог.
Просто закомментируйте атрибут модели в моем случае поле author
и run migrations
и некомментируйте поле author
и запустите миграции снова.
Я хотел бы сказать вам, в чем была проблема, но я не знаю, но это решило проблему, с которой я столкнулся.