13

我们有一个清晰的表单,我们希望能够在表单模板的不同部分呈现不同的字段,但是我们在Crispy 文档HTML中找不到这样做的方法。下面是一些稍微编造的代码来说明我们正在尝试做的事情:

表格.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')
    )
)

模板.html

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

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


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

  • 我们可以在 HTML 中手动添加字段,而不是让脆皮为我们渲染它们。但是,这看起来是不行的,因为我们有许多choice字段的选项是通过编程方式确定的。
  • 我们可以编写一个清晰的布局,它使用一个crispy.forms.layout.HTML包含 HTML 的对象来分割我们布局的两个不同部分。但是,有很多 HTML,如果我们将其直接嵌入到 python 中,将变得难以维护。
  • 我们可以编写一个自定义布局对象来为我们执行此操作,但是我们预测这将非常复杂,并希望将其视为最后的手段。
  • 我们可以不使用crispy,而是寻找crispy 之外的方法来实现这一点,但这样我们就会失去与应用程序中所有其他形式的一致性。
4

2 回答 2

17

更新:这不适用于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)
        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>
于 2013-07-22T11:39:22.947 回答
1

创建一个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

视图.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})

然后在模板中你可以使用

测试.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>
于 2013-07-22T11:09:11.847 回答