我有这个网址映射:
url(r'^article/(?P<slug>[-\w]+)/$', views.ArticleView.as_view(), name='article-detail'),
我有这个观点:
class ArticleView(DetailView):
model = Article
template_name = 'template/article.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super(ArticleView, self).get_context_data(**kwargs)
context['comments'] = self.object.comment_set.filter(approved=True)
return context
我已经显示了所有已批准的评论(如您所见),但我不知道如何在ArticleView中创建评论表单。
我有ModelForm
:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = '__all__'
和...评论模型:
class Comment(models.Model):
author = models.CharField(max_length=100)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
email = models.EmailField()
message = models.TextField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=False)
CommentForm的问题在于我不知道如何隐藏&#39;文章和已批准的字段以及如何使用ArticleView中的文章填充文章字段。
我尝试将FormMixin
与DetailView
合并,但是......当我提交时
评论表单,控制台显示:Method not Allowed (POST)
。
如何在ArticleView中创建表单视图?
如果你没有得到什么,请问我,我知道我的语法很糟糕。我会尽可能地保持清醒。
提前感谢您的回答。
答案 0 :(得分:1)
像这样设置一个临时变量,您无需在ArticleView中设置初始值
就是这样
context['form'] = self.get_form()
还有这个
def form_valid(self, form):
new_comment = form.save(commit=False)
new_comment.post = self.get_object()
return super(ArticleView, self).form_valid(form)
答案 1 :(得分:0)
我解决了,有点......
class ArticleView(FormMixin, DetailView):
model = Article
template_name = 'template/article.html'
form_class = CommentForm
def get_success_url(self):
return reverse('article-detail', kwargs={'slug': self.object.slug})
def get_context_data(self, **kwargs):
context = super(ArticleView, self).get_context_data(**kwargs)
context['form'] = CommentForm(initial={
'article': self.object
})
context['comments'] = self.object.comment_set.filter(approved=True)
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.save()
return super(ArticleView, self).form_valid(form)
forms.py
中的:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
exclude = ('admitted',)
widgets = {
'article': forms.HiddenInput()
}
我唯一的方法是......为该文章字段设置一个值(这是该文章的外键)是在ArticleView中设置初始值。
如果有人有更好的选择,我也很高兴看到它。
答案 2 :(得分:0)
我知道已经好几年了,但也许我的回答对某人有用 Yierstem 的回答对我有用,但我做了一些更改
首先,更改 1433
以使用父模型的 get_success_url
:
get_absolute_url
首先将 def get_success_url(self):
return self.object.get_absolute_url()
方法添加到父模型:
get_absolute_url
其次,我将目标文章和作者(评论模型的外键)添加到 def get_absolute_url(self):
return reverse('record_detail', args=[str(self.pk)]
方法中:
form_valid