Разметка полей в Django Crispy Form

У нас есть хрустящая форма, где мы хотим иметь возможность отображать разные поля в разных частях формы HTML, однако мы не можем найти способ сделать это в Хрустящая документация. Ниже приведен некоторый слегка составленный код для иллюстрации того, что мы пытаемся сделать:

forms.py

helper = FormHelper()
helper.layout_1 = Layout(
    Div(
        Field('field_1a'),
        Field('field_1b')
    )
)
helper.layout_2 = Layout(
    Div(
        Field('field_2a'),
        Field('field_2b')
    )
)

template.html

<body>
    {% crispy form layout_1 %}
    <!-- A big bunch of other html -->
    {% crispy form layout_2 %}
</body>

Кто-нибудь знает, какой способ достичь этого?


Подходы, которые мы рассмотрели до сих пор, должны были исключить:

  • Мы могли бы вручную добавлять поля в наш HTML вместо того, чтобы хрустящие визуализировать их для нас. Тем не менее, это выглядит не-go, потому что у нас есть несколько полей choice, опции которых определяются программно.
  • Мы могли бы написать хрустящий макет, который использует объект crispy.forms.layout.HTML для включения HTML, который разбивает две разные части нашего макета. Тем не менее, существует много HTML, и это будет трудно поддерживать, если мы встроили его непосредственно в python.
  • Мы могли бы написать Пользовательский объект макета, чтобы сделать это для нас, однако мы прогнозируем, что это будет весьма вовлекать и хотеть считать это последним курорт.
  • Мы могли бы просто не использовать хрустящие, и вместо этого искать пути вне хрустящих, чтобы достичь этого, но тогда мы потеряем согласованность со всеми другими формами в нашем приложении.

Ответ 1

Обновление: это не работает для forms.ModelForm

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

forms.py

class Form(forms.Form):
    field_1a = forms.CharField()
    field_1b = forms.CharField()
    field_2a = forms.CharField()
    field_2b = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        helper1 = FormHelper()
        helper1.form_tag = False
        helper1.layout = Layout(
            Div(
                Field('field_1a'),
                Field('field_1b')
            )
        )

        helper2 = FormHelper()
        helper2.form_tag = False
        helper2.disable_csrf = True
        helper2.layout = Layout(
            Div(
                Field('field_2a'),
                Field('field_2b')
            )
        )

Затем в вашем шаблоне:

<body>
<form>
{% crispy form form.helper1 %}
<!-- A big bunch of other html -->
{% crispy form form.helper2 %}
</form>
</body>

Ответ 2

создать form.py

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Field,Layout, ButtonHolder, Submit
class layout1Form(forms.Form):    
    def __init__(self, *args, **kwargs):
        super(layout1Form, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.layout = Layout(
           Field('answer',css_class="field span8"),
           ButtonHolder(
              Submit('submit', 'Submit', css_class='btn-primary pull-right')
            )
          )
        self.helper.form_tag = False

class layout2Form(forms.Form):    
    def __init__(self, *args, **kwargs):
        super(layout1Form, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.layout = Layout(
           Field('answer',css_class="field span8"),
           ButtonHolder(
              Submit('submit', 'Submit', css_class='btn-primary pull-right')
            )
          )
        self.helper.form_tag = False

а затем в views.py

views.py

from ...forms import layout1Form,layout2Form
def layouttest(request):
    form = layout1Form(request.POST)
    form1=layout2Form(request.POST)
    return render(request,'test.html',{'frm1':form,'frm2':form1})

то в шаблонах, которые вы можете использовать в

test.html

<form id="signup" class="form-horizontal" method="post" action="">
{% crispy frm1 %}
   ""the big html""
{% crispy frm2 %}
<button type="submit" class="btn btn-success">Submit</button>   
</form>