我和Django一起写了一个博客(比如:mysite.com/a/page_id/),希望用户能够对文章的评论页面(即:mysite.com/a/文章_id/注释/)发表评论。
到目前为止我还没有取得多大的成功。在url中的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?或者另一种方法?
谢谢。
发布于 2013-03-22 09:36:24
好的,我解决了我的问题,只需按医生说的去做。我输入的评论如下:
url(r'^comments/', include('django.contrib.comments.urls')),并保留此url指向我的detail_comments视图,该视图显示评论列表和表单:
url(r'^a/(?P<post_id>\d+)/comments/$', 'detail_comments'),因此,处理基本上发生在/comments/,但用户与此页面交互:
我唯一的问题是Django注释应用程序在发布评论后自动将用户重定向到成功页面。我通过在表示当前页面的表单中设置一个"next“隐藏字段来解决这个问题。
发布于 2013-03-12 22:32:01
错误消息是非常明确的: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,但这似乎有点过火了。
https://stackoverflow.com/questions/15146428
复制相似问题