Пользователь без электронной почты не может опубликовать комментарий, используя структуру комментариев Django.

Я заменил шаблон form.html структуры комментариев своим собственным

{% load comments i18n %}
<form action="{% comment_form_target %}" method="post">{% csrf_token %}
    <div><input type="hidden" name="next" value="{{ request.get_full_path }}" /></div>

    {% for field in form %}
        {% if field.is_hidden %}
            <div>{{ field }}</div>
        {% else %}
            {% if field.name != "name" and field.name != "url" and field.name != "email" %}
                {% if field.errors %}{{ field.errors }}{% endif %}
                <p
                    {% if field.errors %} class="error"{% endif %}
                    {% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}
                >
                    {{ field.label_tag }}<br />
                    {{ field }}
                </p>
            {% endif %}
        {% endif %}
    {% endfor %}

    <p class="submit">
        <input type="submit" name="post" class="submit-post" value="{% trans "Post" %}" />
    </p>
</form>

Он в значительной степени отображает только необходимые скрытые поля (для безопасности) и поле комментариев. Все comment.user автоматически устанавливаются как текущий вошедший в систему пользователь request.user. Вот отрендеренный HTML:

<form action="/comments/post/" method="post"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bd05094c2e3ba80e1fbec8a4237b132c' /></div>
    <div><input type="hidden" name="next" value="/doors/orders/1/" /></div>
    <div><input type="hidden" name="content_type" value="doors.order" id="id_content_type" /></div>
    <div><input type="hidden" name="object_pk" value="1" id="id_object_pk" /></div>
    <div><input type="hidden" name="timestamp" value="1333125894" id="id_timestamp" /></div>
    <div><input type="hidden" name="security_hash" value="c6791aafdd682cd8db5595681073c9a21c5fe7dd" id="id_security_hash" /></div>
    <p>
        <label for="id_comment">Comment</label><br />
        <textarea id="id_comment" rows="10" cols="40" name="comment"></textarea>
    </p>
    <p style="display:none;" >
        <label for="id_honeypot">If you enter anything in this field your comment will be treated as spam</label><br />
        <input type="text" name="honeypot" id="id_honeypot" />
    </p>
    <p class="submit">
        <input type="submit" name="post" class="submit-post" value="Post" />
    </p>
</form>

Проблема в том, что я заметил, что если у вошедшего в систему пользователя нет электронной почты, то комментарии идут на preview.html (что я не переопределил). Вот скриншот:

Это проблема безопасности, поскольку она позволяет кому-то изменить свое имя вместо использования имени вошедшего в систему пользователя перед публикацией (когда я перечисляю комментарии, я использую comment.user.get_full_name вместо comment.name, так что это не проблема, но это все еще может сбивать с толку в , скажем, админка).

Итак, мои вопросы:

  1. Как разрешить пользователям без электронной почты комментировать?
  2. Как запретить переход формы на preview.html?
  3. Мой код и дизайн на данный момент хороши?

person hobbes3    schedule 30.03.2012    source источник
comment
Комментарии Джанго далеки от совершенства. Но вы можете переопределить их и использовать свою собственную модель и форму.   -  person ilvar    schedule 31.03.2012
comment
Но они позаботятся о некоторых хороших мерах безопасности, таких как поле-приманка, двойная публикация, POST с отметкой времени, хэш безопасности и т. д.   -  person hobbes3    schedule 01.04.2012
comment
Вам не нужно через все это прочь. Просто измените модель и форму (которые также могут быть унаследованы от вклада Джанго).   -  person ilvar    schedule 02.04.2012


Ответы (1)


Ну, вы можете использовать документацию по настройки для создания пользовательского приложение, которое обрабатывает комментарии из структуры комментариев. Вы должны установить COMMENTS_APP = 'my_comment_app' в файле настроек и указать метод get_form() в __init__.py вашего приложения, который должен возвращать вашу пользовательскую форму.

Пользовательская форма должна быть основана на contrib.comments.forms.CommentForm и должна выглядеть примерно так:

class CustomForm(comment_forms.CommentForm):
    def __init__(*args, **kwargs):
        super(CustomFors, self).__init__(*args, **kwargs)
        self.fields["email"].required = False

preview.html отображается, потому что форма содержит ошибки (требуется emai, но у пользователя его нет, поэтому он не заполняется). Если ошибок нет - превью показываться не будет.

person DataGreed    schedule 20.07.2012