Аутентифицированный комментарий в Django 1.1?

121
14

(Теперь, когда 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 будут пустыми и просто извлекут эту информацию из соответствующей модели профиля, исправьте?


Хотя ответы могут быть довольно тривиальными в конце, я просто удивлен, что он не был написан или даже не говорил.

спросил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
1
Решение
102

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 выше стандартным вызовом формы комментария.

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
91

Я рекомендую, чтобы при возникновении вопроса о внутренних компонентах Django вы посмотрите на источник.


Если мы посмотрим на начало представления post_comment, мы увидим, что запрос POST-запроса был скопирован, а адрес электронной почты и имя пользователя вставлены. Они все еще требуются (как показано в источник формы), поэтому эти данные должны либо входить в форму, либо пользователь должен их предоставить.


Чтобы ответить на ваш вопрос Superjoe, представление присоединяет пользователя к комментарию до его сохранения (как видно ближе к концу представления post_comment).

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
65

Используйте модель профиля для дополнительных учетных данных, кроме имени пользователя и пароля. Вы можете вызвать user.get_profile(), если включить эту строку в профиль:


user = models.ForeignKey(User, unique=True)

и эту строку в settings.py:


AUTH_PROFILE_MODULE = 'yourapp.Profile'

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
65

Theju написал аутентифицированное приложение комментариев - http://thejaswi.info/tech/blog/2009/08/04/reusable-app-authenticated-comments/

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
65

Во-первых, приложение комментариев уже поддерживает как аутентифицированных, так и анонимных пользователей, поэтому я предполагаю, что вы хотите принимать комментарии только от прошедших проверку подлинности пользователей?


У Thejaswi Puthraya была серия статьи в своем блоге об этом. В принципе, он предварительно заполняет поля name и email в форме комментария и заменяет их скрытыми полями, а затем определяет представление оболочки вокруг post_comment, чтобы гарантировать, что публикация комментария пользователем такая же, как вошедшая в систему пользователя, между прочим. Казалось довольно простым, хотя, возможно, немного утомительным.


Его блог, похоже, сейчас не работает... надеюсь, что он только временный.

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
46

В соответствии с комментарием это либо - либо: другие поля предназначены для использования, когда user не установлен. Вы проверили, что соответствующие столбцы, определенно, не являются NULL? Они обозначены как blank=True, которые обычно обозначают required=False на уровне поля. Если вы действительно пробовали, какие ошибки вы получаете?

ответил(а) 2021-01-19T14:50:14+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема