【问题标题】:Use django comments on article's comment page (/a/2/comments/)在文章的评论页面上使用 django 评论 (/a/2/comments/)
【发布时间】:2013-02-15 06:53:11
【问题描述】:

我用 Django 写了一个博客,里面有文章(例如:mysite.com/a/article_id/),并希望用户能够在文章的评论页面上发表评论(即:mysite .com/a/article_id/cmets/)

到目前为止,我还没有取得太大的成功。似乎 url 中的 article_id 以某种方式阻止了 cmets 应用程序。

这是我的 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_cmets.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 &rarr;" /></p>
</form>
{% endblock %}

(哦,这很明显,但是 cmets 应用程序安装在 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 }}/cmets/post/ 替换它来“破解”我的出路,它可以显示页面,但是如果我尝试发表评论,django 抛出不同的错误:

TypeError at /a/2/comments/post/
post_comment() got an unexpected keyword argument 'post_id'

有没有办法让 cmets 应用程序忽略 id_post?或者其他方式来做到这一点?

谢谢。

【问题讨论】:

    标签: django django-comments


    【解决方案1】:

    好的,我通过简单地按照文档所说的方式解决了我的问题。我像这样导入了 cmets:

    url(r'^comments/', include('django.contrib.comments.urls')),
    

    并保持此 url 指向我的 detail_cmets 视图,该视图显示评论列表和表单:

    url(r'^a/(?P<post_id>\d+)/comments/$', 'detail_comments'),
    

    所以基本上处理发生在 /cmets/ 但用户与此页面交互:/a/post_id/cmets/

    我遇到的唯一问题是 Django cmets 应用程序在发布评论后自动将用户重定向到成功页面。 我通过在指示当前页面的表单中设置“下一个”隐藏字段来解决这个问题。

    【讨论】:

      【解决方案2】:

      错误消息非常明确: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,但这似乎有点过头了。

      【讨论】:

      • 感谢您的回答!当您回答时,我已经找到了解决方案(我已发布),但您的前两个建议看起来也可以。最后,我认为第三种选择是最好的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2012-06-30
      • 2014-12-11
      • 2017-12-16
      相关资源
      最近更新 更多