Python Django Crispy表单分割字段布局
我们有一个清晰的表单,我们希望能够在表单的不同部分Python Django Crispy表单分割字段布局,python,django,layout,django-forms,django-crispy-forms,Python,Django,Layout,Django Forms,Django Crispy Forms,我们有一个清晰的表单,我们希望能够在表单的不同部分HTML模板中呈现不同的字段,但是我们找不到一种方法来实现这一点。下面是一些稍加编造的代码,以说明我们正在尝试做什么: forms.py helper = FormHelper() helper.layout_1 = Layout( Div( Field('field_1a'), Field('field_1b') ) ) helper.layout_2 = Layout( Div(
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>
{%crispy表单布局_1%}
{%crispy表单布局_2%}
有人知道一个干净的方法来实现这一点吗
到目前为止,我们研究的方法必须排除:
- 我们可以在HTML中手动添加字段,而不用crispy为我们呈现字段。然而,这看起来是不可能的,因为我们有许多
字段,它们的选项是通过编程确定的choice
- 我们可以编写一个crispy布局,它使用
对象包含将布局的两个不同部分分开的HTML。然而,有很多HTML,如果我们将其直接嵌入python,则很难对其进行维护crispy.forms.layout.HTML
我们可以为我们写一篇文章,但是我们预测这将是非常牵连的,并且要考虑这是最后的选择。
- 我们不能仅仅使用crispy,而是寻找crispy之外的方法来实现这一点,但这样我们将失去与应用程序中所有其他形式的一致性
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
然后在模板中,您可以在中使用
test.html
{%crispy frm1%}
“”大html“”
{%crispy frm2%}
提交
更新:这不适用于表单。ModelForm
尝试创建两个帮助程序而不是两个布局,然后显式调用单独的帮助程序。这样做,您必须手动编写
标记,将两个表单都包含在模板中,但希望能提供所需的解决方案
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)
self.helper1 = FormHelper()
self.helper1.form_tag = False
self.helper1.layout = Layout(
Div(
Field('field_1a'),
Field('field_1b')
)
)
self.helper2 = FormHelper()
self.helper2.form_tag = False
self.helper2.disable_csrf = True
self.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>
{%crispy form.helper1%}
{%crispy form.helper2%}
感谢您的建议@suhail,我们已经考虑过使用HTML元素,但是我们在布局的不同部分之间有很多HTML,并且希望避免在python代码中嵌入太多HTML(因为维护HTML会更困难)。@robjohncox可能是您可以使用类似于self.helper['']的模板(字段,模板=”)
很有意思,这看起来是可行的。我们可以走这条路——等着看人们还有什么其他建议。@robjohncox我已经用其他方法更新了我的答案。实际上我正在使用crispyforms。这些都是从我的工作项目中提取的啊,所以可以分为两种形式,这对我们的用例来说是有意义的另一种方法(来自@scottwoodall)更适合一点,但仍然是一个整洁的解决方案,所以对您来说是+1。这是您正在使用的ModelForm
吗?不,它只是一个香草django.forms.Form
那么,是否将所有字段都渲染两次而不仅仅是您在每个布局中指定的字段?我没有看到您当前解决方案的问题。我们正在在布局的不同部分显示不同的字段。上面的代码实际上不起作用-这更多的是为了说明我们正在尝试做什么(如果不够清楚,请道歉)@scott我正在尝试,但问题是第二个助手渲染(再次)也在第一个帮助程序中的字段。有什么线索吗?在使用ModelForm时,这不起作用。每个表单字段都由每个帮助程序输出,不管布局中有哪些字段。@对于ModelForms,如果hasattr(self.Meta,'fields'):delattr(self.Meta,'fields'),则可以执行
在\uuuuu init\uuuuuu
块的末尾,您可以绕过它
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)
self.helper1 = FormHelper()
self.helper1.form_tag = False
self.helper1.layout = Layout(
Div(
Field('field_1a'),
Field('field_1b')
)
)
self.helper2 = FormHelper()
self.helper2.form_tag = False
self.helper2.disable_csrf = True
self.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>