2

Djangoで記事(mysite.com/a/article_id/など)を使用してブログを作成しました。ユーザーが記事のコメントページ(mysite.com/a/article_id/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="/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は次のエラーをスローします。

NoReverseMatch at /a/2/comments/
Reverse for 'django.contrib.comments.views.comments.post_comment' with arguments '()' and keyword arguments '{}' not found.

ページを表示するために機能するこの/a/ {{post.id}} / projects / post /に置き換えて、「ハッキング」しようとしましたが、コメントを投稿しようとすると、djangoは別のエラーをスローします。

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

コメントアプリにid_postを無視させる方法はありますか?またはこれを行う別の方法?

ありがとう。

4

2 に答える 2

0

エラー メッセージは非常に明確です。引数django.contrib.comments.views.post_commentを取らないためpost_id、スローされます。

commentsビューは引数を必要とせず、望んでいないので、単に省略しないのはなぜですか?

次のように、post_id をまったくキャプチャしないように URL ルートを変更できるはずです (ただし、一貫性が失われます)。

    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場合に 404 をスローすることですが、それはやり過ぎのようです。post_id

于 2013-03-12T22:32:01.170 に答える
0

わかりましたので、ドキュメントの言うことを実行するだけで問題を解決しました。コメントを次のようにインポートしました。

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

そして、コメントリストとフォームを表示する私のdetail_commentsビューを指すこのURLを保持しました:

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

したがって、基本的に処理は/comments/で行われますが、ユーザーは次のページを操作します: /a/post_id/comments/

私が抱えていた唯一の問題は、コメントを投稿した後、Django コメント アプリがユーザーを成功ページに自動的にリダイレクトすることでした。現在のページを示すフォームに「次の」非表示フィールドを設定することで、これを解決しました。

于 2013-03-22T09:36:24.453 に答える