IntegrityError NOT NULL约束失败:-在验证表单时缺少用户id(anotheromedel的外键)



上一篇:无法导入"misaka"-Django

我正在学习一个关于如何建立社交网络的教程。

我遇到了这个错误:

/posts/new/NOT-NULL约束处的IntegrityError失败:post_post.user_id

完成回溯(请注意粗体行(:

The above exception (NOT NULL constraint failed: posts_post.user_id) was the direct cause of the following exception:
C:Applicazioni_TommasoPhytonlibsite-packagesdjangocorehandlersexception.py in inner
response = get_response(request) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangocorehandlersbase.py in _get_response
response = self.process_exception_by_middleware(e, request) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangocorehandlersbase.py in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoviewsgenericbase.py in view
return self.dispatch(request, *args, **kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangocontribauthmixins.py in dispatch
return super().dispatch(request, *args, **kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoviewsgenericbase.py in dispatch
return handler(request, *args, **kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoviewsgenericedit.py in post
return super().post(request, *args, **kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoviewsgenericedit.py in post
return self.form_valid(form) …

▶ Local vars
C:UsersTommasoDjango rest frameworkUdemy Djangosimplesocialpostsviews.py in form_valid
**return super().form_valid(form)** …

▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoviewsgenericedit.py in form_valid
self.object = form.save() …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangoformsmodels.py in save
self.instance.save() …

▶ Local vars
C:UsersTommasoDjango rest frameworkUdemy Djangosimplesocialpostsmodels.py in save
**super().save(*args, **kwargs)** …

▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsbase.py in save
force_update=force_update, update_fields=update_fields) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsbase.py in save_base
force_update, using, update_fields, …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsbase.py in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsbase.py in _do_insert
using=using, raw=raw) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsmanager.py in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelsquery.py in _insert
return query.get_compiler(using=using).execute_sql(return_id) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbmodelssqlcompiler.py in execute_sql
cursor.execute(sql, params) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendsutils.py in execute
return super().execute(sql, params) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendsutils.py in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendsutils.py in _execute_with_wrappers
return executor(sql, params, many, context) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendsutils.py in _execute
return self.cursor.execute(sql, params) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbutils.py in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendsutils.py in _execute
return self.cursor.execute(sql, params) …
▶ Local vars
C:Applicazioni_TommasoPhytonlibsite-packagesdjangodbbackendssqlite3base.py in execute
return Database.Cursor.execute(self, query, params) …
▶ Local vars

粗体的行指向这两段代码:

1:在my_project\posts\views.py中form_valid:

def form_valid(self, form):
self.object = form.save(commit=False)
self.object = self.request.user
self.object.save()
return super().form_valid(form) #<--highligted line 

2:在my_project\posts\models.py中保存

def save(self, *args, **kwargs):
self.message_html = m.html(self.message)
super().save(*args, **kwargs) #<--highligted line 

当用户在社交网络的群组内发布新帖子时,运行这些功能。

我使用的是VScode,所以我注意到,很明显,我的代码不能识别misaka,通过pip安装并导入如下:

import misaka as m

Pylint导入错误:无法导入"misaka">

我读过misaka文档,但不明白哪里出了问题
请注意,我使用的是Misaka 2.1.0版本,显然不需要在设置中安装在installed_APPS中。

有什么想法吗?

由于有人建议我尝试在不设置用户外键的情况下在数据库中创建一个Post模型对象,因此您可以在这里看到我的my_project/posts/model.py:

from django.db import models
from django.urls import reverse #vho corretto io, ersione di django cambiata
from django.conf import settings
import misaka as m
from groups.models import Group
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
user = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(Group, related_name="posts", null=True, blank=True, on_delete=models.CASCADE)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = m.html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username':self.user.username, 'pk':self.pk})
class Meta:
ordering = ['-created_at']
unique_together = ['user', 'message'] 

您试图在不设置User外键的情况下将Post模型对象插入数据库。

您应该首先将其设置为附加到请求的用户对象。

def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)

查看Django文档

已解决:

正如@ebram-shehata所建议的,代码试图在不设置User外键的情况下将Post模型对象插入数据库,这是因为在form_valid(self, form)方法中,我拼错了一行。

我取代了

def form_valid(self, form):
self.object = form.save(commit=False)
self.object = self.request.user
self.object.save()
return super().form_valid(form)

带有:

def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return super().form_valid(form)

现在效果很好!

添加:

self.object.user = self.request.user 

并将self.object替换为self.object()

使您获得:

def form_valid(self, form): 
self.object = form.save(commit=False) 
self.object.user = self.request.user 
self.object.save() 
return super().form_valid(form)

最新更新