2013-02-28 40 views
2

我用Django寫了一篇博客文章(如:mysite.com/a/article_id/),希望用戶能夠發表評論該文章的評論頁面上(即:mysite.com/a/article_id/comments/)在文章的評論頁面上使用django評論(/ a/2/comments /)

到目前爲止,我還沒有太多成功。看起來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="https://stackoverflow.com/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 %} 

(哦和th是是一種明顯的,但評論的應用程序安裝在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

好,所以我通過簡單地做文檔說什麼解決了我的問題。我進口同類的意見,以便:

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

並保持此URL指向我detail_comments視圖,其中顯示評論列表和形式:

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

所以基本上處理髮生在/評論/,但用戶與此頁面交互:/a/post_id/comments/

我唯一遇到的問題是發佈評論後,Django評論應用程序會自動將用戶重定向到成功頁面。 我通過在表單中​​設置一個「下一個」隱藏字段來解決這個問題。

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錯誤,但這看起來過度。

+0

感謝您的回答!當你回答時,我已經找到了一個解決方案(我發佈了),但你的前兩個建議看起來也可以起作用。最後,我認爲第三個選擇是最好的。 – oliv23 2013-03-22 09:44:48