Настройка комментариев django
-
16-09-2019 - |
Вопрос
Итак, я использую django.contrib.comments.Я установил его нормально, но вместо громоздкой формы комментариев по умолчанию я хотел бы использовать собственный шаблон формы, который просто отображает текстовое поле и кнопку отправки.
Обоснование этого заключается в том, что пользователь видит форму только в том случае, если он уже прошел аутентификацию, и я бы хотел, чтобы форма была простой и автоматически подбирала его имя пользователя и т. д.
Я внедрил пользовательскую форму, но при попытке отправить ее получаю сообщение об ошибке.
Вот что у меня есть в шаблоне страницы с формой комментариев (запись — это объект, переданный из представления):
{% load comments %}
{% render_comment_form for entry %}
А вот мой HTML в /templates/comments/form.html:
{% if user.is_authenticated %}
<p>Submit a comment:</p>
<form action="/comments/post/" method="post">
<textarea name="comment" id="id_comment" rows="2" style="width: 90%;"></textarea>
<input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" />
<input type="hidden" name="gonzo" value="{{ hash }}" />
<input type="hidden" name="next" value="{{ entry.get_absolute_url }}" />
<span style="float:right;"><input type="submit" name="post" value="Add"></span>
</form>
{% else %}
<p>Please <a href="/login/">log in</a> to post a comment.</p>
{% endif %}
Первоначально все отображается нормально, но когда я пытаюсь отправить форму комментария, я получаю следующую ошибку Django:
Comment post not allowed (400)
Why: Missing content_type or object_pk field.
Кто-нибудь может помочь?
Решение 2
Исправлена проблема путем копирования из Приложение Теджу - в частности, см. комментарий Джошуа Уоркса к части 2.
Другие советы
Модель комментариев использует общий внешний ключ для сопоставления с объектом, для которого был сделан комментарий, например записью в блоге.Это обязательные скрытые поля, включенные в стандартную форму комментариев.
Из django.contrib.comments.models.
...
class CommentSecurityForm(forms.Form):
"""
Handles the security aspects (anti-spoofing) for comment forms.
"""
content_type = forms.CharField(widget=forms.HiddenInput)
object_pk = forms.CharField(widget=forms.HiddenInput)
...
Если вы не изменили класс формы и хотите изменить только шаблон HTML, вы можете включить эти поля, добавив цикл for ко всем скрытым полям.
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}