Аутентифицированный комментарий в Django 1.1?
(Теперь, когда Django 1.1 находится в статусе кандидата в релизе, это может быть подходящее время, чтобы спросить об этом.)
Я всюду искал способы расширения приложения комментариев Django для поддержки аутентифицированных комментариев. Несколько раз прочитав модель комментариев, я обнаружил, что ForeignKey
до User
уже существует.
От django.contrib.comments.models
:
class Comment(BaseCommentAbstractModel):
"""
A user comment about some object.
"""
# Who posted this comment? If ``user`` is set then it was an authenticated
# user; otherwise at least user_name should have been set and the comment
# was posted by a non-authenticated user.
user = models.ForeignKey(User, verbose_name=_('user'),
blank=True, null=True, related_name="%(class)s_comments")
user_name = models.CharField(_("user name"), max_length=50, blank=True)
user_email = models.EmailField(_("user email address"), blank=True)
user_url = models.URLField(_("user URL"), blank=True)
Похоже, что я не могу придумать настройку User
. Если я использую комментарии как есть, даже если я аутентифицирован, все равно, кажется, нужны другие поля. Я предполагаю, что я должен переопределить форму и сделать ее там? Кроме того, если я использую User
, я должен игнорировать тот факт, что user_name
, user_email
и user_url
будут пустыми и просто извлекут эту информацию из соответствующей модели профиля, исправьте?
Хотя ответы могут быть довольно тривиальными в конце, я просто удивлен, что он не был написан или даже не говорил.
WordPress и другие системы делают это без проблем. Если вы вошли в систему, форма комментария должна просто "сделать правильную вещь" и удалить поля name/email/url. Разве это не означает, что именно такой тяжелый подъем рамки должен делать для вас?
Вместо того, чтобы танцевать с моделями подклассов для чего-то, что должно быть тривиально легко, я считаю, что проще создать форму вручную в шаблоне и предоставить скрытые значения полей, которые ему нужны. Это отлично работает для сайтов, которые принимают только комментарии от пользователей, прошедших проверку подлинности:
{% if user.is_authenticated %}
{% get_comment_form for [object] as form %}
<form action="{% comment_form_target %}" method="POST">
{% csrf_token %}
{{ form.comment }}
{{ form.honeypot }}
{{ form.content_type }}
{{ form.object_pk }}
{{ form.timestamp }}
{{ form.security_hash }}
<input type="hidden" name="next" value="{% url [the_view] [object].id %}" />
<input type="submit" value="Add comment" id="id_submit" />
</form>
{% else %}
<p>Please <a href="{% url auth_login %}">log in</a> to leave a comment.</p>
{% endif %}
Обратите внимание, что это оставит поле honeypot видимым; вы захотите скрыть его в своем CSS:
#id_honeypot {
visibility:hidden;
}
Если вы хотите включить комментарии для анонимных или аутентифицированных пользователей, замените строку auth_login выше стандартным вызовом формы комментария.
Я рекомендую, чтобы при возникновении вопроса о внутренних компонентах Django вы посмотрите на источник.
Если мы посмотрим на начало представления post_comment, мы увидим, что запрос POST-запроса был скопирован, а адрес электронной почты и имя пользователя вставлены. Они все еще требуются (как показано в источник формы), поэтому эти данные должны либо входить в форму, либо пользователь должен их предоставить.
Чтобы ответить на ваш вопрос Superjoe, представление присоединяет пользователя к комментарию до его сохранения (как видно ближе к концу представления post_comment).
Используйте модель профиля для дополнительных учетных данных, кроме имени пользователя и пароля. Вы можете вызвать user.get_profile(), если включить эту строку в профиль:
user = models.ForeignKey(User, unique=True)
и эту строку в settings.py:
AUTH_PROFILE_MODULE = 'yourapp.Profile'
Theju написал аутентифицированное приложение комментариев - http://thejaswi.info/tech/blog/2009/08/04/reusable-app-authenticated-comments/
Во-первых, приложение комментариев уже поддерживает как аутентифицированных, так и анонимных пользователей, поэтому я предполагаю, что вы хотите принимать комментарии только от прошедших проверку подлинности пользователей?
У Thejaswi Puthraya была серия статьи в своем блоге об этом. В принципе, он предварительно заполняет поля name
и email
в форме комментария и заменяет их скрытыми полями, а затем определяет представление оболочки вокруг post_comment
, чтобы гарантировать, что публикация комментария пользователем такая же, как вошедшая в систему пользователя, между прочим. Казалось довольно простым, хотя, возможно, немного утомительным.
Его блог, похоже, сейчас не работает... надеюсь, что он только временный.
В соответствии с комментарием это либо - либо: другие поля предназначены для использования, когда user
не установлен. Вы проверили, что соответствующие столбцы, определенно, не являются NULL? Они обозначены как blank=True
, которые обычно обозначают required=False
на уровне поля. Если вы действительно пробовали, какие ошибки вы получаете?