Django脆皮形式分裂场布局

rob*_*cox 12 python django layout django-forms django-crispy-forms

我们有一个脆弱的形式,我们希望能够在表单HTML模板的不同部分呈现不同的字段,但是我们在Crispy文档中找不到这样做的方法.下面是一些稍微简化的代码,用于说明我们要做的事情:

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')
    )
)
Run Code Online (Sandbox Code Playgroud)

template.html

<body>
    {% crispy form layout_1 %}
    <!-- A big bunch of other html -->
    {% crispy form layout_2 %}
</body>
Run Code Online (Sandbox Code Playgroud)

有谁知道实现这一目标的干净方法?


到目前为止我们已经看过的方法必须排除:

  • 我们可以在HTML中手动添加字段,而不是为我们提供crispy渲染.但是,这看起来是不可取的,因为我们有许多choice字段,其选项以编程方式确定.
  • 我们可以编写一个令人毛骨悚然的布局,它使用一个crispy.forms.layout.HTML对象来包含HTML,它将我们布局的两个不同部分分开.但是,有很多HTML,如果我们将它直接嵌入到python中,将很难维护.
  • 我们可以编写一个自定义布局对象来为我们这样做,但是我们预测这将是非常复杂的,并且想要将此视为最后的手段.
  • 我们可以不使用crispy,而是寻找方法以外的方法实现这一点,但是然后我们将失去与我们的应用程序中的所有其他形式的一致性.

Sco*_*all 15

更新:这不起作用 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')
            )
        )
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

<body>
<form>
{% crispy form form.helper1 %}
<!-- A big bunch of other html -->
{% crispy form form.helper2 %}
</form>
</body>
Run Code Online (Sandbox Code Playgroud)

  • 这在使用 ModelForm 时不起作用。无论布局中有哪些字段,每个助手都会输出每个表单字段。 (2认同)