2012-03-30 3 views
2

Я отменяю 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. Действительно ли мой код и дизайн хороши?
+1

Комментарии Django далеки от совершенства. Но вы можете переопределить их и использовать свою собственную модель и форму. – ilvar

+0

Но они позаботятся о некоторых хороших мерах безопасности, таких как поле honeypot, двойная проводка, timestamped POST, хэш безопасности и т. Д. – hobbes3

+0

Вам не нужно все это прочь. Просто измените модель и форму (которая также может быть унаследована от вклада Django). – ilvar

ответ

0

Ну, вы можете использовать документацию customization для создания пользовательского приложения, которое обрабатывает комментарии из рамки комментариев. Вы должны установить 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, но пользователь не имеет его и поэтому не населены). Если ошибок нет - предварительный просмотр не будет показан.

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

  • Нет связанных вопросов^_^