我与Django一起撰写了一篇博客文章(如:mysite.com/a/article_id/),并希望用户能够对文章的评论页面发表评论(即:mysite的.com / A /的article_id /评论/)
到目前为止,我还没有取得多大成功。似乎网址中的 article_id 会以某种方式阻止评论应用。
这是我的 url.py :
from django.conf.urls import patterns, include, url
from django.contrib.auth.views import login, logout
urlpatterns = patterns('blogengine.views',
url(r'^$', 'get_posts', name='index'),
url(r'^write/', 'write_post', name='write'),
url(r'^a/(?P<post_id>\d+)/$', 'detail'),
url(r'^a/(?P<post_id>\d+)/comments/$', 'detail_comments'),
url(r'^a/(?P<post_id>\d+)/comments/', include('django.contrib.comments.urls')),
)
以下是我的观点 - views.py :
def detail_comments(request, post_id):
p = get_object_or_404(Post, pk=post_id)
return render_to_response('blogengine/detail_comments.html', {'post': p},
context_instance=RequestContext(request))
这是我的模板detail_comments.html
{% block content %}
{% load comments %}
{% get_comment_form for post as form %}
<form action="/a/{{ post.id }}/comments/post/" method="post">
{% csrf_token %}
{{ form.content_type }}
{{ form.object_pk }}
{{ form.timestamp }}
{{ form.security_hash }}
<p style="display:none"><label for="id_honeypot">Leave blank</label>{{ form.honeypot }}</p>
<p>
<label for="id_comment">Comment</label>
{{ form.comment }}
</p>
<p><input type="submit" name="post" value="Post →" /></p>
</form>
{% endblock %}
(哦,这很明显,但评论应用程序安装在settings.py中)
如果表单操作设置为 {%comment_form_target%} ,就像文档中建议的那样,django会抛出此错误:
NoReverseMatch at /a/2/comments/
Reverse for 'django.contrib.comments.views.comments.post_comment' with arguments '()' and keyword arguments '{}' not found.
我试图通过用 / a / {{post.id}} / comments / post / 替换它来尝试“黑客攻击”,这样可以显示页面但是如果我尝试发表评论,django抛出了另一个错误:
TypeError at /a/2/comments/post/
post_comment() got an unexpected keyword argument 'post_id'
有没有办法让评论应用忽略id_post?还是另一种方法呢?
感谢。
答案 0 :(得分:0)
错误消息非常明确:django.contrib.comments.views.post_comment
不接受post_id
参数,因此它会抛出。
由于comments
视图不需要也不想要参数,为什么不把它留下来呢?
您应该能够修改URL路由,而不是捕获post_id(尽管以一致性为代价),如下所示:
url(r'^a/(?:\d+)/comments/', include('django.contrib.comments.urls')),
或只是
url(r'^a/\d+/comments/', include('django.contrib.comments.urls')),
请注意,如果它只是被忽略,那么在这一点上进行这种嵌套真的没有意义,所以你可以将它简化为:
url(r'^comments/', include('django.contrib.comments.urls')),
当然,如果没有残留的前缀,这看起来并不漂亮和伪RESTful,但是如果你只是忽略它,那就没有意义了。
你可以做的另一件事是将comments
应用提供的所有视图都包起来,这样如果post_id
无效就会抛出404,但这似乎有点过分了。
答案 1 :(得分:0)
好的,所以我只是按照文档所说的来解决我的问题。我导入了这样的评论:
url(r'^comments/', include('django.contrib.comments.urls')),
并保持此网址指向我的 detail_comments 视图,该视图显示评论列表和表单:
url(r'^a/(?P<post_id>\d+)/comments/$', 'detail_comments'),
基本上,处理过程发生在 / comments / ,但用户会与此页面进行互动: / a / post_id / comments /
我遇到的唯一问题是Django评论应用程序在发布评论后自动将用户重定向到成功页面。 我通过在表示当前页面的表单中设置“下一个”隐藏字段来解决这个问题。