【问题标题】:Pass slug and context to render page?传递 slug 和上下文来渲染页面?
【发布时间】:2013-12-28 21:35:35
【问题描述】:

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

评论表单可以正常提交,但不会显示验证错误。

我不知道如何通过 both slug(DetailView 所需)AND 表单(包含验证错误)。

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

网址:

...
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 的情况下做到这一点?)并将表单包含在上下文中,以便我可以显示评论表单验证错误。

四处搜索,找不到任何相关答案。

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    如果你重构它以使用评论模块附带的自定义标签之一呢?

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

    你可以使用get_comment_form标签和object来避免传递表单吗?

    【讨论】:

      【解决方案2】:

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

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

      发布完整代码后编辑

      该视图代码有几处错误(空白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 %}
      

      【讨论】:

      • 但这与render 无关。那是为了渲染一个模板,因此得名。你为什么要调用渲染?
      • 你仍然没有解释你希望用这些东西做什么。并且您需要在上下文中正确解释此代码所在的位置:即发布 actual 视图,显示您调用它的位置以及您希望如何处理响应。
      • 抱歉,除非您显示使用此函数的实际代码和函数的完整代码(不是您现在发布的无效 sn-p),否则我不准备进一步帮助您.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      相关资源
      最近更新 更多