Django FOREIGN KEY约束在提交表单后失败



你好,从3天开始学习Django。在表单中键入内容后,单击提交按钮,我希望将标题分配给用户。但我得到了这个错误:

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

在管理面板中,表格也被保存;作者"将显示下拉列表,但没有将用户分配给作者。

//型号.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})

我面对类似的问题长达数小时,但没有任何答案。

在我的例子中,只需注释模型的属性author字段和run migrations,取消注释author字段,然后再次运行迁移。

我希望能告诉你问题是什么,但我不知道,但这解决了我面临的问题。

您是否使用自定义用户模型您的Todos模型引用了一个用户settings.AUTH_USER_MODEL作为author字段,但您的user模型似乎与此无关您使用的是django的默认用户模型,还是自定义模型。如果要创建以电子邮件为用户名的自定义用户模型,请签出https://learndjango.com/tutorials/django-custom-user-model.否则,请尝试:

author = models.ForeignKey(
User, on_delete=models.CASCADE, blank=True, null=True)

但是,如果你创建的这个用户模型不是一个自定义模型,那么我不明白为什么你不能使用这里描述的django的常规用户模型。

编辑
没有理由使用

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

Django的User模型已经有了用户名、电子邮件和密码字段。如果这就是你想要的,那么就没有必要扩展用户模型。这可能就是造成问题的原因。我还想补充一点,您不需要User = get_user_model()I forms.py,在那里我根本看不到您使用用户模型。在你看来,你已经有了from django.contrib.auth.models import User

最新更新