Django DetailView与评论表单

时间:2017-04-25 10:09:31

标签: django forms

我有这个网址映射:

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中的文章填充文章字段。

我尝试将FormMixinDetailView合并,但是......当我提交时  评论表单,控制台显示:Method not Allowed (POST)。 如何在ArticleView中创建表单视图?

如果你没有得到什么,请问我,我知道我的语法很糟糕。我会尽可能地保持清醒。

提前感谢您的回答。

3 个答案:

答案 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