python - 是什么导致 Django 中出现此错误:NOT NULL 约束失败:mainapp_comment.post_id
问题描述
我正在用 Django 制作社交网络 Web 应用程序。我已经确定了大部分所需的功能,但我坚持让评论系统正常工作。我最初拥有它是为了让用户可以为自己的评论命名,但我决定不这样做。
发帖系统有它,所以登录并发帖的用户,他们的名字将显示给帖子的作者。这就是为什么某些代码在 2 之间复制粘贴的原因。
我已经尝试过各种各样的事情,比如让视图成为一个类而不是一个函数。它没有用,我又回到了原点。现在用户可以发帖没有问题,但是没有记录用户名,我必须在管理界面中手动设置作者。
views.py 中的相关代码
class CreatePostView(LoginRequiredMixin,CreateView):
login_url = '/login/'
redirect_field_name = 'mainapp/post_details.html'
form_class = PostForm
model = Post
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
@login_required
def add_comment_to_post(request,pk):
post = get_object_or_404(Post,pk=pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('mainapp:post_detail',pk=post.pk)
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
else:
form = CommentForm()
return render(request,'mainapp/comment_form.html',{'form':form})
这是来自models.py的相关代码
class UserProfileInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.CharField(max_length=150)
profile_pic = models.ImageField(upload_to='profile_pics',blank=True)
verified = models.BooleanField(default=False)
def __str__(self):
return self.user.username
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=75)
text = models.TextField(max_length=250)
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True,null=True,auto_now_add=True)
tags = TaggableManager()
def publish(self):
self.published_date = timezone.now()
self.save()
def approve_comments(self):
return self.comments.filter(approved_comment=True)
def get_absolute_url(self):
return reverse('mainapp:post_detail',kwargs={'pk':self.pk})
def __str__(self):
return self.title
class Comment(models.Model):
post = models.ForeignKey('mainapp.Post',related_name='comments',on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=True)
def approve(self):
self.approved_comment = True
self.save()
def get_absolute_url(self):
return reverse('post_list')
def __str__(self):
return self.text
这是 forms.py 文件,带有 CommentForm 类
class CommentForm(forms.ModelForm):
class Meta():
model = Comment
fields = ('text',)
widgets = {
'text':forms.Textarea(attrs={'class':'textareaclass'}),
}
这是 views.py 中的一点,它使我所说的 Post 系统工作正常
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
如果这个问题很长,我很抱歉,但提前谢谢你:)
目前,我只是对为什么这不起作用感到困惑。它适用于帖子系统,但我无法真正弄清楚这个评论系统。谢谢 :)
解决方案
我对您的帖子的标题有些困惑-我不确定为什么您post_id
在设置时会遇到非空约束失败comment.post
-但以下内容应该可以将当前用户附加为评论:
@login_required
def add_comment_to_post(request,pk):
post = get_object_or_404(Post,pk=pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user # add this line
comment.save()
return redirect('mainapp:post_detail',pk=post.pk)
# remove `def form_valid`
else:
form = CommentForm()
return render(request,'mainapp/comment_form.html',{'form':form})
请注意删除了form_valid
内联函数定义,该定义仅作为基于类的视图上下文中的方法才有意义。
推荐阅读
- java - 如何将 dto 映射到服务层中的实体,其中实体具有对象引用且 dto 具有实例 var
- python - TypeError:“NoneType”不可迭代
- python - 如何询问用户是否要重新运行程序
- arrays - 在具有 O(1) 空间的四个(单独)排序数组中查找中值
- scala - 为什么 play-json 在读取/解析时会丢失精度?
- python - 在循环中仅将列表的值添加到另一个列表
- c++ - 为什么gtest看不到==的定义?
- reactjs - 使用反应路由器设置基本名称
- vue.js - 在 nativescript-vue 中从 ListView 创建组件
- docker - 如何为从 Docker 映像启动的容器预定义最大运行时磁盘空间?