首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django评论文章的评论页面(/a/2/注释/)

使用django评论文章的评论页面(/a/2/注释/)
EN

Stack Overflow用户
提问于 2013-02-28 21:55:58
回答 2查看 1.2K关注 0票数 2

我和Django一起写了一个博客(比如:mysite.com/a/page_id/),希望用户能够对文章的评论页面(即:mysite.com/a/文章_id/注释/)发表评论。

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

这是我的url.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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 %}

(哦,这很明显,但注释应用程序是在settings.py中安装的)

如果窗体操作设置为{% comment_form_target %},就像文档中所建议的那样,django抛出此错误:

代码语言:javascript
复制
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会抛出一个不同的错误:

代码语言:javascript
复制
TypeError at /a/2/comments/post/
post_comment() got an unexpected keyword argument 'post_id'

有没有办法让评论应用程序忽略id_post?或者另一种方法?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-22 09:36:24

好的,我解决了我的问题,只需按医生说的去做。我输入的评论如下:

代码语言:javascript
复制
url(r'^comments/', include('django.contrib.comments.urls')),

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

代码语言:javascript
复制
url(r'^a/(?P<post_id>\d+)/comments/$', 'detail_comments'),

因此,处理基本上发生在/comments/,但用户与此页面交互:

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

票数 0
EN

Stack Overflow用户

发布于 2013-03-12 22:32:01

错误消息是非常明确的:django.contrib.comments.views.post_comment不接受post_id参数,所以它抛出。

既然comments视图既不需要也不想要这个参数,那么为什么不直接忽略它呢?

您应该能够修改URL路由,从而完全不捕获post_id (尽管代价是一致性),如下所示:

代码语言:javascript
复制
    url(r'^a/(?:\d+)/comments/', include('django.contrib.comments.urls')),

或者简单的

代码语言:javascript
复制
    url(r'^a/\d+/comments/', include('django.contrib.comments.urls')),

请注意,如果这种嵌套将被忽略,那么在这里进行这种嵌套实际上是没有意义的,因此您可以将其简化为:

代码语言:javascript
复制
    url(r'^comments/', include('django.contrib.comments.urls')),

当然,如果没有残留前缀,这看起来就不那么漂亮和伪RESTful了,但是如果你要忽略它的话,那么拥有它真的是没有意义的。

您可以做的另一件事是封装comments应用程序提供的所有视图,这样如果post_id无效,它们就会抛出404,但这似乎有点过火了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15146428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档