Вставка заголовка в форму Django - PullRequest
3 голосов
/ 11 марта 2009

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

Name: ___________
Company: ___________

Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]

То есть, я бы хотел, чтобы заголовок «Заинтересованный» был вставлен в середину вывода формы.

Один из способов сделать это состоит в том, чтобы выписать код шаблона для каждого поля и вставить соответствующий заголовок. Однако я бы предпочел не делать этого. Я подозреваю, что есть что-то связанное с наборами форм, которые будут делать то, что я хочу.

Есть ли способ сделать то, что я хочу, или мне просто нужно смириться с этим и принять, что мне нужно написать свой шаблон для этого от руки?

Ответы [ 4 ]

3 голосов
/ 11 марта 2009

Форм-наборы Django не подходят: они используются, если вам нужно редактировать несколько объектов одновременно. Наборы полей HTML больше похожи на правильный путь. Я полагаю, вы можете сгруппировать поля имени и компании в один набор полей, а затем поля интересов в другой.

В DjangoSnippets вы можете найти шаблонный тег , который помогает группировать .

Используя этот фрагмент, вы определите группировку в своем представлении как

fieldsets = (
    ('', {'fields': ('name','company')}),
    ('Interested in', {'fields': ('foo','bar','baz')})
)

Передайте его шаблону вместе с формой и отрендируйте форму с помощью

{% draw_form form fieldsets %}

Я бы предпочел не определять группировку в представлении, так как это в основном вопрос представления и должно принадлежать представлению, но, черт возьми, это, похоже, делает работу! Решение

muhuk выглядит более элегантно, чем это ...

3 голосов
/ 11 марта 2009

С FieldsetMixin вы получаете наборы полей, похожие на Admin. Вы создаете свою форму так:

from django.forms import Form
from formfieldset.forms import FieldsetMixin


class MyForm(Form, FieldsetMixin):
    fieldsets = (
        (u'', {'fields': ['name', 'company']}),
        (u'Interested in', {'fields': ['foo', 'bar', 'baz']}),
    )

    # rest of the form
0 голосов
/ 13 июня 2014

Это что-то вроде хака, но вы можете определить HeaderWidget, который просто отображает его значение:

from django.forms.util import flatatt
from django.utils.html import format_html

class HeaderWidget(forms.widgets.Widget):
    def render(self, name, value, attrs=None):
        attrs.update(self.attrs)
        return format_html('<div{0}>{1}</div>', flatatt(attrs), value)

, а затем добавьте поле в нужном месте с помощью этого виджета:

header = forms.CharField(
    widget=HeaderWidget(attrs={'class': 'my-css-class'}),
    initial='Interested in',
    required=False,
    label='')

Небольшим недостатком является то, что вы отправите заголовок "value" вместе с вашей формой.

0 голосов
/ 11 марта 2009

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

См:

http://docs.djangoproject.com/en/dev/topics/forms/?from=olddocs#looping-over-the-form-s-fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...