Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Crispy表单分割字段布局_Python_Django_Layout_Django Forms_Django Crispy Forms - Fatal编程技术网

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布局,它使用
    crispy.forms.layout.HTML
    对象包含将布局的两个不同部分分开的HTML。然而,有很多HTML,如果我们将其直接嵌入python,则很难对其进行维护
  • 我们可以为我们写一篇文章,但是我们预测这将是非常牵连的,并且要考虑这是最后的选择。
  • 我们不能仅仅使用crispy,而是寻找crispy之外的方法来实现这一点,但这样我们将失去与应用程序中所有其他形式的一致性
创建一个表单.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 然后在模板中,您可以在中使用

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>