2009-07-22 6 views
6

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

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

ответ

1

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

+0

Я изначально проголосовал за этот ответ, но после работы с решением Theju на некоторое время нашел его ограничивающим. Теперь я предпочитаю просто создавать форму вручную, придерживаясь всех полей, которые Django ожидает (в соответствии с ниже). – shacker

1

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

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

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

AUTH_PROFILE_MODULE = 'yourapp.Profile' 
+0

Благодарим вас, хотя я знаю, как получить информацию из модели профиля. Не могли бы вы получить представление о передаче '' user'' в комментарий? –

0

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

1

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

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

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

3

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

Если мы посмотрим на start of post_comment view, мы увидим, что запрос POST querydict будет скопирован и добавлены имя пользователя и имя пользователя. Они по-прежнему требуются (см. form's source), поэтому эти данные должны либо вводиться в форму, либо пользователь должен их предоставить.

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

+0

Спасибо Крису, почему-то я все время обнаруживал, что смотрю на модели вместо взглядов. Поэтому я могу технически просто использовать 'exclude()' в подклассовой форме и удалить поля имени, адреса электронной почты и URL-адресов, и он будет работать так же, как есть? Стоит попробовать, спасибо еще раз. :) –

+0

Да, либо 'exclude = (...)', либо вы можете сделать логику в '' __init__' вашей формы, передав пользователю и выскочив поля, если пользователь аутентифицирован. – SmileyChris

4

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

Смежные вопросы