python - django中form_valid的问题
问题描述
我在 Django 中使用带有 Detail View 和 FormMixin 的 CBV 以及函数 form_valid 来列出帖子和创建评论。但是当我尝试创建评论时,我得到了图片中的错误。我还希望用户只能以他的名字创建评论,但是当我尝试创建评论时,我会得到一个我可以选择的所有作者的列表。
这是我的看法
class PostDetail(FormMixin,generic.DetailView):
model = PostModel
template_name = 'post_detail.html'
form_class=CommentForm
fields=['comment']
def get_success_url(self):
return reverse('post_detail',kwargs={'slug':self.object.slug})
def get_context_data(self, **kwargs):
context = super(PostDetail,self).get_context_data(**kwargs)
context ['commentmodel_list'] = CommentModel.objects.filter(post=self.object).order_by('-created_on')
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.post=self.model.post
self.object.save()
return super(PostDetail,self).form_valid(form)
这是我的模型
class PostModel(models.Model):
post = models.TextField(max_length=256, unique=True)
slug = models.SlugField(max_length=20, unique=True)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='post_author')
created_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_on']
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.post)
super().save(*args, **kwargs)
def __str__(self):
return self.post
class CommentModel(models.Model):
post = models.ForeignKey('dictionary.PostModel', on_delete=models.CASCADE, related_name='post_comment')
comment=models.TextField(max_length=256,unique=True)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='comment_author')
created_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_on']
def get_absolute_url(self):
return reverse("comment_detail",kwargs={'pk':self.pk})
def __str__(self):
return self.comment
解决方案
同时使用 aform_class
和fields
没有意义,因为fields
它们仅用于使用ModelForm
[ modelform_factory
Django-doc]创建 a 。如果您因此指定 a form_class
,则form_class
不应列出不必要的字段:
class CommentForm(forms.ModelForm):
class Meta:
model = CommentModel
fields = ['comment']
此外,我建议在这里使用ModelFormMixin
[Django-doc],因为这将删除更多样板代码。由于您的表单包装了一个Comment
对象,因此您不能将它包装的对象设置为self.object
,因为那是一个PostModel
对象。您可以将 设置self.object
为PostModel
您评论的位置,然后更新包装在 中的.author
and :.post
.instance
form
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import ModelFormMixin
class PostDetail(LoginRequiredMixin, ModelFormMixin, generic.DetailView):
model = PostModel
template_name = 'post_detail.html'
form_class = CommentForm
def get_success_url(self):
return reverse('post_detail',kwargs={'slug':self.object.slug})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context ['commentmodel_list'] = CommentModel.objects.filter(post=self.object).order_by('-created_on')
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.post = self.object
return super().form_valid(form)
您可能希望str(…)
在定义__str__
模型对象时调用:
class PostModel(models.Model):
# …
def __str__(self):
return str(self.post)
class CommentModel(models.Model):
# …
def __str__(self):
return str(self.comment)
注意:型号通常没有
Model
后缀。因此,最好重命名为PostModel
Post
.
注意:您可以使用
LoginRequiredMixin
mixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。
推荐阅读
- javascript - How can i filter a list of divs when 2 checkboxes are checked using jquery or javascript?
- angular - How to access a Set after asynchronous calls are complete
- vue.js - 将图像位置动态传递给 Bootstrap-Vue 的 b-card 似乎不起作用?
- java - 使用 Selenium 在 whatsapp 上分享图像 - Java
- pyspark - Pyspark dataproc 作业失败
- javascript - 如何用您自己的文本更改选择框文本
- javascript - 脚本不显示新记录,它只是继续显示相同的记录
- ssis - SSIS 阻止从已存在于 SQL Server 表中的平面文件中插入数据行
- dart - Flutter 如何播放 youtube 播放列表视频?
- android - 在包含 RecyclerView 的 Activity 中加载片段