Отображать свободный текст между полями Django Form

У меня есть форма следующего вида:

class MyForm(Form):

  #personal data
  firstname = CharField()
  lastname = CharField()

  #education data
  university = CharField()
  major = CharField()

  #foobar data
  foobar = ChoiceField()

Поскольку некоторые поля (например, foobar) заполняются из базы данных, я не могу использовать другой метод, кроме как позволить Django отобразить его для меня с помощью form.as_ul

Также я хотел бы, чтобы мне не приходилось разбивать форму на несколько форм для простоты обслуживания.

Есть ли способ заставить Django отображать текст справки между этими разделами формы, чтобы я мог ввести некоторые инструкции о том, как заполнить форму?

Я хотел бы, чтобы форма отображала что-то вроде этого:

<form>

  <p>Here you enter your personal data...</p>
  <input name='firstname'>
  <input name='lastname'>

  <p>Here you enter your education data...</p>
  <input name='university'>
  <input name='major'>

</form>

Мне нужно создать свой собственный виджет, чтобы иметь возможность отображать эти теги <P>, или есть более простой способ?

Спасибо


person Lorenzo    schedule 07.04.2009    source источник


Ответы (8)


Один из способов сделать это без отображения вашей формы в шаблоне с помощью form.as_ul — с помощью django-uni-form. Сначала вам нужно скачать его здесь и установить. Тогда код для настройки вашей формы может выглядеть примерно так:

from uni_form.helpers import FormHelper, Submit, Layout, Fieldset

class MyForm(Form):

    #personal data
    firstname = CharField()
    lastname = CharField()

    #education data
    university = CharField()
    major = CharField()

    #foobar data
    foobar = ChoiceField()

    # now attach a uni_form helper to display the form
    helper = FormHelper()

    # create the layout
    layout = Layout(
         # first fieldset
         Fieldset("Here you enter your personal data...",
             'firstname', 'lastname'),
         Fieldset("Here you enter your education data...",
             'university', 'major'),
         Fieldset('foobar')

    # and add a submit button
    sumbit = Submit('add', 'Submit information')
    helper.add_input(submit)

Теперь, чтобы отобразить это в вашем шаблоне, вы должны сделать следующее:

{% load uni_form %}
{% with form.helper as helper %}
    {% uni_form form helper %}
{% endwith %}

Это выведет HTML (примерно) следующим образом:

<form>
<fieldset><legend>Here you enter your personal data...</legend>
<input name='firstname'>
<input name='lastname'>
</fieldset>

<fieldset><legend>Here you enter your education data...</legend>
<input name='university'>
<input name='major'>
</fieldset>

<fieldset>
<input name='foobar'>
</fieldset>

</form>

Для получения дополнительной информации о uni_form прочитайте их документы (см. ссылку выше).

PS: я понимаю, что этот ответ запоздал, и я уверен, что вы уже решили эту проблему, но я думаю, что это должно быть полезно для тех, кто только что столкнулся с этим сейчас.

person hora    schedule 10.11.2009

Если вы хотите настроить форму, вам не нужно отображать ее form.as_ul. Django знает, как отображать foobar, если вы правильно настроили модель форм... попробуйте... не беспокойтесь.

Посмотрите какой питон на сервер отправил вашу страницу. Например, если он отправил форму django следующим образом:

return respond(request, user, 'templateName', { 'myform':myform })

тогда templateName.html будет иметь:

<blockquote>
<form>

    <p>Here you enter your personal data...</p>
    {{myform.firstname }}

    <p>Here you enter your education data...</p>
    {{myform.university }}

    <p> a choice field </p>
    {{myform.foobar}}

</form>
</blockquote>
person Community    schedule 14.05.2009

Поскольку каждый раздел представляет собой набор нескольких независимых полей формы, я рекомендую использовать собственный шаблон формы. Это дает вам абсолютный полный контроль над макетом с минимальной дополнительной работой. Документы Django по Настройка шаблона формы содержат детали.

person Jarret Hardie    schedule 07.04.2009
comment
Правда, я мог бы также вывести кое-что на основе имени поля - person Lorenzo; 08.04.2009

Помните также, что объект Django Form — это просто набор полей; нет необходимости в соответствии 1:1 между тегами формы HTML и объектами формы Django. Если различные разделы формы на самом деле логически разделены, вы можете рассмотреть возможность разделения ее на три формы, которые затем вы можете отображать в своем шаблоне с любым HTML-кодом, который вы хотите между ними (но все же в пределах одного тега HTML-формы).

Является ли это разумным решением, во многом зависит от дизайна вашего приложения и представления, конечно.

person Carl Meyer    schedule 08.04.2009

В известных вам формах есть поле help_text.

в forms.py:

  • myField = forms.myFieldType(help_text="Helping friendly text to put in your form", otherStuff=otherStuff)

в forms.html:

  • {{form.myField.help_text}}
person hendrixski    schedule 11.01.2010

Даже если ваша форма заполняется из базы данных, вы все равно должны иметь возможность вручную написать форму или использовать шаблон. Ознакомьтесь с документацией по формам Django, чтобы подробнее.

person mipadi    schedule 07.04.2009

Для тех, кто находится в ситуации, подобной автору, я рекомендую вернуться к CSS и псевдоселекторам :before и/или :after либо к input, либо к label элементам формы. Они работают так же хорошо и могут сделать вашу жизнь намного проще, поскольку вы по-прежнему можете использовать {{ form.as_p }}.

person Nicolas R    schedule 27.07.2010

согласен с @mipadi, кажется, это самый простой способ.

Так что-то вроде

$('.selector').append('<html></html>')
person mexekanez    schedule 24.05.2015