Используйте комментарии django на странице комментариев к статье (/a/2/comments/)

Я создал блог с помощью Django со статьями (например, mysite.com/a/article_id/) и хотел бы, чтобы пользователи могли комментировать страницу комментариев к статье (например, mysite.com/ а/идентификатор_статьи/комментарии/)

Пока у меня не было большого успеха. Кажется, что article_id в URL каким-то образом блокирует приложение для комментариев.

Это мой 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 }}/comments/post/, который работает для отображения страницы, но затем, если я попытаюсь опубликовать комментарий , django выдает другую ошибку:

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

Есть ли способ заставить приложение комментариев игнорировать id_post? Или другой способ сделать это?

Спасибо.


person oliv23    schedule 28.02.2013    source источник


Ответы (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, чтобы они выдавали 404, если post_id недействителен, но это кажется излишним.

person Alan Plum    schedule 12.03.2013
comment
Спасибо за Ваш ответ! К тому времени, когда вы ответили, я уже нашел решение (которое я опубликовал), но ваши первые два предложения выглядят так, как будто они тоже могут работать. В конце концов, я думаю, что третий вариант является лучшим. - person oliv23; 22.03.2013

Итак, я решил свою проблему, просто сделав то, что говорят документы. Я импортировал комментарии так:

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

И сохранил этот URL-адрес, указывающий на мое представление detail_comments, которое отображает список комментариев и форму:

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

Таким образом, в основном обработка происходит на /comments/, но пользователь взаимодействует с этой страницей: /a/post_id/comments/

Единственная проблема, с которой я столкнулся, заключалась в том, что приложение комментариев Django автоматически перенаправляло пользователя на страницу успеха после публикации комментария. Я решил это, установив «следующее» скрытое поле в форме, указывающее текущую страницу.

person oliv23    schedule 22.03.2013