传递slug和上下文来渲染页面?

时间:2013-12-11 03:57:20

标签: django django-views django-urls

我正在使用DetailView显示条目,并且在同一页面上也有一个评论表单。

提交表单适用于提交,但不显示验证错误。

我无法弄清楚如何传递两者 slug (DetailView所需) AND 表格(包含验证错误)。

我不想在我的html模板中显示slug - 我需要slug来检索Entry的详细视图。

地址:

...
url(r'^(?P<slug>[\w-]+)/$', EntryDetailView.as_view(), name='entry_detail'),
...

查看:

class EntryDetailView(DetailView):
    template_name = "entry_detail.html"

    def get_context_data(self, **kwargs):
        context = super(EntryDetailView, self).get_context_data(**kwargs)

        context['comments'] =  [(comment, comment.get_children_count()) for comment in EntryComment.get_tree()]

        entry_comment_form = EntryCommentForm()
        context['entry_comment_form'] = entry_comment_form

        return context

    def get_object(self, **kwargs):
        # If the user created the entry:
        try: return Entry.objects.get(Q(slug=self.kwargs['slug']), author=self.request.user.id)
        except: pass

        # If the user received the entry:
        try: return Entry.objects.get(Q(slug=self.kwargs['slug']), recipients=self.request.user)
        except: pass

        # Otherwise, bye-bye.
        raise Http404

    def post(self, request, *args, **kwargs):
        entry_comment_form = EntryCommentForm(request.POST)

        if entry_comment_form.is_valid():
            entry_comment_form.add_method(
                author=entry_comment_form.cleaned_data['author'],
                body=entry_comment_form.cleaned_data['body'],
                date_created=datetime.datetime.now()
            )

            success(request, 'Success')
            slug = self.kwargs['slug']

            # Proper? It works.
            return HttpResponseRedirect(reverse('entry_detail', subdomain='blog', kwargs={'slug':slug}))

        else:
            error(request, 'Error')
            slug = self.kwargs['slug']

            # Here's where I need to render the same Entry but include the form context so I can display the validation errors.
            return render(
                request,
                reverse('entry_detail', kwargs={'slug':slug}), 
                {'entry_comment_form':entry_comment_form}
            )

由于我缺少python / django foo,似乎在某个地方只是一个新手的错误。

最终目标是显示相同的DetailView页面(有没有办法在不将slug传递给url的情况下执行此操作?)并在上下文中包含表单,以便我可以显示注释表单验证错误。

周围搜索,找不到任何相关答案。

2 个答案:

答案 0 :(得分:0)

如果您重构它以使用评论模块附带的自定义标签,该怎么办?

https://docs.djangoproject.com/en/1.5/ref/contrib/comments/#quickly-rendering-the-comment-form

您可以将get_comment_form标记与object一起使用,以避免传递表单吗?

答案 1 :(得分:0)

你在尝试什么是没有意义的。您在调用reverse函数时将render的结果(即网址)作为模板传递。你为什么这样做?

但是,为了真正帮助你,我们需要知道你在做什么。这个奇怪的代码在哪里?它是在视图函数,基于类的视图方法,模板标记还是其他地方?

完整代码发布后修改

该视图代码存在一些问题(空白excepts仅执行pass?),但我将专注于手头的问题。你似乎比它需要的更难:如果你想将表单和slug / URL传递给模板,你只需将它们放在模板上下文中,并将上下文传递给render像平常一样。这里没有任何异常或复杂的东西。

return render(
    request,
    self.template_name,
    {'entry_comment_form':entry_comment_form, 'slug': slug}
)

请注意,最好在上下文中传递slug并使用模板中的url标记:

{% url 'entry_detail' slug=slug %}