Аутентифицированные комментарии в Django 1.1? - PullRequest
6 голосов
/ 22 июля 2009

(Теперь, когда 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's name"), max_length=50, blank=True)
    user_email  = models.EmailField(_("user's email address"), blank=True)
    user_url    = models.URLField(_("user's URL"), blank=True)

Кажется, я не могу разобраться с настройкой user. Если я использую комментарии как есть, даже если я аутентифицирован, все равно, кажется, требуются другие поля. Я предполагаю, что я должен переопределить форму и сделать это там? Кроме того, если я использую user, я должен игнорировать тот факт, что user_name, user_email и user_url будут пустыми, и просто извлекать эту информацию из связанной модели профиля, правильно?

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

Ответы [ 6 ]

4 голосов
/ 15 февраля 2010

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

3 голосов
/ 28 июля 2009

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

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

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

1 голос
/ 04 августа 2009

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

1 голос
/ 22 июля 2009

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

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

Его блог в настоящее время не работает ... надеюсь, он временный.

1 голос
/ 22 июля 2009

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

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

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

AUTH_PROFILE_MODULE = 'yourapp.Profile'
0 голосов
/ 22 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...