我正在使用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的情况下执行此操作?)并在上下文中包含表单,以便我可以显示注释表单验证错误。
周围搜索,找不到任何相关答案。
答案 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 %}