Как настроить форму комментариев Django?

Я пытаюсь настроить форму комментариев Django. Внутри django.contrib.comments.forms я заметил, что все формы полей объявлены в классе CommentDetailForm, который унаследован от CommentSecurityForm. Затем я думаю, что когда я пишу тег шаблона {% get_comment_form for order as form %}, он получает класс с именем CommentForm, который наследует CommentDetailForm с полем-приманкой.

Я хотел настроить форму комментариев так, чтобы она отображала только поле комментариев (а не необязательные поля имени, адреса электронной почты или URL-адреса). Эта информация будет предоставлена ​​текущим зарегистрированным пользователем. Фактически, комментировать могут только зарегистрированные пользователи с определенным UserProfile.user_type (UserProfile имеет внешний ключ для User).

Любые советы о том, как этого добиться? Глядя на исходный код комментариев Django, я уже пугаюсь, лол.

ИЗМЕНИТЬ:

Вот как выглядит шаблон комментария на данный момент:

{% get_comment_form for order as form %}
    <form action = "{% comment_form_target %}" method = "post">
        {% csrf_token %}
        {{ form }}
        <input type = "submit" name = "submit" value = "Post">
    </form>

А сайт выглядит так

Я хочу скрыть Name, Email address и URL.


person hobbes3    schedule 27.03.2012    source источник
comment
UserProfile не общается один на один с User? Кроме того, если вы не беспокоитесь о безопасности, самый простой способ — просто сделать поля скрытыми в шаблоне и заполнить их пользователем и т. д.   -  person agf    schedule 27.03.2012
comment
Ну, даже если я сделаю {% render_comment_form for order %}, есть ли способ скрыть это, если только у User.profile нет определенного user_type?   -  person hobbes3    schedule 27.03.2012
comment
О, ты прав, лол. Хорошо, а как насчет того, чтобы скрыть другие поля? Что значит сделать поля скрытыми в шаблоне? Я обновлю свой вопрос, чтобы показать вам, что я делаю прямо сейчас.   -  person hobbes3    schedule 27.03.2012


Ответы (1)


Вы должны быть в состоянии сделать все это в шаблоне:

{% ifequal User.profile.user_type "comment_type" %}
{% get_comment_form for order as form %}
  <form action="{% comment_form_target %}" method="post">
    {% csrf_token %}
    {% for field in form %}
    {% ifequal field.name "name" %}
        <input id="id_name" type="hidden" name="name" value="{{ user.username }}" />
    {% else %}{% ifequal field.name "email" %}
        <input type="hidden" name="email" value="{{ user.email }}" id="id_email" />
    {% else %}{{ field }}{% endifequal %}{% endifequal %}
    {% endfor %}    
        <input type="submit" name="submit" value="Post">
  </form>
{% endifequal %}
person agf    schedule 27.03.2012
comment
Я не думаю, что мне нужно добавлять значение для name или email. Все они являются необязательными. Фактически, комментарии Django делают это автоматически (возможно, где-то в models.py. Как мне просто только показать поле comments (и при этом иметь преимущество скрытых полей-приманок и встроенной безопасности) ? - person hobbes3; 27.03.2012
comment
Если вы вообще не хотите иметь поле, просто выполните {% ifequal field.name "name" %}{% else %} Handle the other fields here {% endifequal %}. Просто оставьте основную часть ifequal пустой. Я не уверен, что я могу добавить к тому, что я включил в ответ - это позволяет вам управлять формой, как вы хотите. - person agf; 27.03.2012
comment
Хорошо, я сделал это с {% if field.name != "name" and field.name != "email" and field.name != "url" %}, но есть ли способ показать это как form.as_p? Я все еще хочу добавить поле honeypot, но Django скрывает его с помощью <p style = 'display : none'>. Или я должен вручную стилизовать его самостоятельно? На самом деле я также хотел бы, чтобы поле comment было в формате .as_p. - person hobbes3; 27.03.2012
comment
Я не знаю, что такое form.as_p. - person agf; 27.03.2012
comment
Form.as_p. Когда вы делаете {{ form }}, он фактически по умолчанию отображает его как form.as_p. И Django автоматически скрывает тег <p>, который окружает поле приманки. - person hobbes3; 27.03.2012
comment
Неважно, я понял это, посмотрев на шаблон form.html внутри структуры комментариев Django под django.contrib.comments. Спасибо за вашу помощь! - person hobbes3; 27.03.2012
comment
На следующей неделе мне придется использовать это на сайте, так что это тоже мне поможет :) - person agf; 27.03.2012
comment
И последний вопрос. Как вы думаете, лучше написать собственный HTML-код в шаблоне с помощью {% get_comment_form for order as form %} или переопределить form.html Django и просто вызвать {% render_comment_form for order %}? - person hobbes3; 27.03.2012
comment
Я на самом деле не знаю, но если он достаточно отличается, мне кажется, что было бы лучше переопределить form.html. Как бы Вы это сделали? - person agf; 27.03.2012
comment
Я использую Django v1.4, но есть аналогичный пример с переопределение шаблонов администратора в официальных руководствах по Django. В основном вы настраиваете свой TEMPLATE_DIR внутри settings.py (я использовал os.path.join( os.path.dirname( __file__ ), '..', 'templates' ).replace( '\\', '/' ),), затем внутри папки template создаете другую папку приложения, шаблон которого вы хотите переопределить, затем внутри этой папки добавляете свой шаблон с тем же именем, что и тот, который вы хотите отменить (form.html). - person hobbes3; 27.03.2012
comment
Так мой выглядит как mysite/templates/comments/form.html. Надеюсь, это поможет! Помните, что в Django v1.4 мои настройки находятся в mysite/mysite/settings.py. Вот почему в моем os.path.dirname() выше есть ... - person hobbes3; 27.03.2012
comment
Я не поклонник этого подхода, так как он доверяет подходу пользователя/браузера, когда скрытые поля копируются из профиля, но нет гарантии, что то, что отправляется обратно, действительно соответствует пользователю. Было бы слишком легко подделать запрос на публикацию и удалить комментарии с ложными именами в неавторизованных каналах комментариев. - person Shayne; 18.07.2021