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