首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django crispy-表单动态label_class和field_class

Django crispy-表单动态label_class和field_class
EN

Stack Overflow用户
提问于 2014-03-19 10:12:03
回答 1查看 997关注 0票数 3

我正在尝试创建一个包含一些字段的表单布局,这些字段的大小与其他字段不同。例如,我将表单布局成行,其中大多数行都有两个字段,但偶尔会有一个字段占据整个行。

代码语言:javascript
复制
--------------------------------------------------
| First Name            | Last Name              |
--------------------------------------------------
| User Name             | Email                  |
--------------------------------------------------
| Bio                                            |
--------------------------------------------------

在上面的示例布局中,每个字段都由标签和实际HTML中的文本输入组成(我只是不知道如何在问题中显示这一点)。我使用的是Bootstrap 3,所以在前两行,我希望标签有一个类‘col-sm-2’,输入字段有一个类‘of sm-4’,这样当渲染时,它们每行(即12列)显示两个字段。但是,对于具有“Bio”字段的第三行,我希望输入字段为“col sm-10”以占据整个行。

以下是一些示例代码,这些代码足够接近,可能会有人提供帮助。

代码语言:javascript
复制
self.helper = FormHelper(self)
self.helper.form_tag = False
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-sm-2'
self.helper.field_class = 'col-sm-4'
self.helper.layout = Layout(
    MultiField(
        'Profile Information',
        Div('first_name', 'last_name'),
        Div(css_class='clearfix'),
        Div('username', 'email'),
        Div(css_class='clearfix'),
        Div('bio', css_class='col-sm-10'),
    ),
)

我尝试过使用Div、Field和Row的几种不同组合,使用组合css_class和wrapper_class,以及尝试创建“自定义”属性,但都不能给出我想要的布局。我甚至尝试了几种不同的嵌套Div(Field)类型结构的组合,但都不起作用。

似乎没有一种方法可以动态地更改“Bio”字段行的helper.field_class。求助于HTML方法似乎真的是错误的,但在这一点上,我只能想到这样做。

EN

回答 1

Stack Overflow用户

发布于 2015-01-27 09:21:23

我有一个类似的函数(为bootstrap 2设计),它可以帮助您实现此目的;它不能像您所请求的那样处理水平表单,但您可以生成动态行:

代码语言:javascript
复制
from crispy_forms import helper
from crispy_forms import layout

def addBootstrapRow(helper, firstField, numFields, wrapperClasses):

        # set classes used for all fields if only one provided
        if type(wrapperClasses) in [str, unicode]:
            wrapperClasses = [wrapperClasses]*numFields

        # find first field, apply wrapper_class for each
        first = helper.layout.index(firstField)
        for i, cls in enumerate(wrapperClasses):
            helper[first+i].wrap(layout.Field, wrapper_class=cls)

        # put all these fields into a row
        helper[first:first+numFields].wrap_together(layout.Div, css_class="row-fluid")

要获得与问题中的格式相似(但不完全相同)的格式,您可以这样做:

代码语言:javascript
复制
class MyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.helper = helper.FormHelper(self)
        addBootstrapRow(self.helper, 'first_name', 2, "span6")  # all fields same
        addBootstrapRow(self.helper, 'username', 2, ["span4", "span8"])  # fields diff.
        addBootstrapRow(self.helper, 'bio', 1, "span12")

可能不是你确切的解决方案,它至少可以帮助其他遇到这个问题的人(比如我)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22494904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档