Ошибки при использовании встроенной структуры комментариев - PullRequest
1 голос
/ 14 апреля 2011

Я пытаюсь использовать встроенный каркас комментариев, но не могу заставить его работать.Вот код:

#view.py
from django.contrib.comments.forms import *
from forms import *
from models import *

def view_item_detail(request, item_id):
    item = Item.manager.get(item_id)
    form = CommentForm(item)

    if request.POST:
        form = CommentForm(request.POST)
        if form.is_valid():
            new_comment = form.save(commit=False)
            # do stuff here
            new_comment.save()
            messages.success(request, "Your comment was successfully posted!")
            return HttpResponseRedirect("")

    return render_to_response('item_detail.html', 
                          RequestContext(request, {'item': item, 
                                    'authentication': request.user.is_authenticated(), 
                                    'user': request.user, 'form': form}))

и

#item_detail.html
{% if authentication %}
    {% if form %}
        <form action="" method="post">{% csrf_token %}
            {{ form }}
            <p><input type="submit" name="submit" value="Submit comment" /></p>
        </form>
    {% endif %}
{% else %}
    <p>You must be logged-in to post a comment</p>
{% endif %}

Я получаю сообщение об ошибке: «У объекта« QueryDict »нет атрибута« _meta »», который исходит из строки

form = CommentForm(request.POST)

Любая помощь будет оценена, ура.

1 Ответ

1 голос
/ 14 апреля 2011

Извините, прочитав ваши комментарии к моему последнему ответу, вам не нужно включать форму комментария в ваше представление, если вы используете встроенную структуру комментариев:

from forms import *
from models import *

def view_item_detail(request, item_id):
    item = get_object_or_404(Item, pk=item_id)

    return render_to_response('item_detail.html', 
                          RequestContext(request, {'item': item, 
                                    'authentication': request.user.is_authenticated(), 
                                    'user': request.user,}))

Теперь убедитесь, что у вас есть этов ваших urls.py:

urlpatterns = patterns('',
    ...
    (r'^comments/', include('django.contrib.comments.urls')),
    ...
)

и 'django.contrib.comments', добавленных к вашему INSTALLED_APPS, и syncdb'd

теперь в вашем файле item_detail.html вы должны добавить:

{% load comments %}

, где вы хотите, чтобы комментарии отображались:

{% render_comment_list for item %}

, где вы хотите, чтобы отображалась форма добавления комментариев:

{% if authentication %}
    {% get_comment_form for item as form %}
    <form action="{% comment_form_target %}" method="post">
        {{ form }}
        <tr>
            <td></td>
            <td><input type="submit" name="preview" class="submit-post" value="Preview"></td>
        </tr>
    </form>
{% endif %}

читать документы here и для настройки прочитайте this page.

как часть документов:

Чтобы указатьURL-адрес, на который вы хотите перенаправить сообщение после публикации комментария, вы можете включить в форму комментария скрытым вводом, который вызывается следующим.Например:

<input type="hidden" name="next" value="{% url my_comment_was_posted %}" />

(отредактировано для вашего примера):

{% if authentication %}
    {% get_comment_form for item as form %}
    <form action="{% comment_form_target %}" method="post">
        {{ form }}
        <tr>
            <td></td>
            <input type="hidden" name="next" value="{{ item.get_absolute_url }}" />
            <td><input type="submit" name="preview" class="submit-post" value="Preview"></td>
        </tr>
    </form>
{% else %}
    <p>You must be logged-in to post a comment</p>
{% endif %}
...