【问题标题】:django-crispy-forms - Default classesdjango-crispy-forms - 默认类
【发布时间】:2014-06-22 16:17:20
【问题描述】:

我正在尝试在现有项目中使用带有 django-crispy-forms 的 Bootstrap 包。

我有大约 15 种表格,我想要这些课程:

label_class = 'col-sm-3'
input_class = 'col-sm-9'

有没有办法在设置或其他地方指定这些默认值,而无需更新我的所有表单?


另外,我以前使用django-bootstrap-form 来指定模板中的类:

{{ my_form|bootstrap_horizontal:'col-sm-3' }}

我发现从模板而不是从表单定义来控制呈现更合乎逻辑。一个表单可以在多个页面中使用而无需相同的渲染

【问题讨论】:

    标签: django django-forms django-crispy-forms


    【解决方案1】:

    Django-crispy-forms 还为 Bootstrap 3 Horizo​​ntal forms 提供了一个选项:http://django-crispy-forms.readthedocs.org/en/latest/crispy_tag_forms.html#bootstrap3-horizontal-forms

    您只需将 3 个属性(form_classlabel_classfield_class)添加到表单助手,而不是将它们添加到每个表单字段:

    helper.form_class = 'form-horizontal'
    helper.label_class = 'col-lg-2'
    helper.field_class = 'col-lg-8'
    helper.layout = Layout(
        'email',
        'password',
        'remember_me',
        StrictButton('Sign in', css_class='btn-default'),
    )
    

    来自文档:

    您在 Bootstrap 版本 3 中执行水平表单的方式是设置一些 标签和 div 包装字段中的 col-lg-X 类。这意味着一个 更新布局对象以设置这些类有很多麻烦, 太多冗长。 添加了一些 FormHelper 属性 帮助您轻松实现这一目标。您只需要设置三个属性。

    更新:适用于多种形式

    对于多种形式,我这样做:

    from crispy_forms.helper import FormHelper
    
    
    def horizontal_helper(form):
        """ Adds the horizontal form classes
        to the given form"""
        form.helper = FormHelper(form)
        form.helper.form_class = 'form-horizontal'
        form.helper.label_class = 'col-md-2'
        form.helper.field_class = 'col-md-6'
    
    
    class SomeForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            super(SomeForm, self).__init__(*args, **kwargs)
            horizontal_helper(self)
            ...
    
    
    class AnotherForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            super(AnotherForm, self).__init__(*args, **kwargs)
            horizontal_helper(self)
            ...
    

    【讨论】:

    • 感谢您的回答。但问题更多的是是否有一种方法可以指定默认类而无需更新我所有现有的表单,即。 horizontal_helper(self)
    • 另外,如果我真的要为每个表单指定一个助手,我宁愿至少使用模板方式({{ crispy my_form my_helper }}
    【解决方案2】:

    不确定它是否非常漂亮,但我还没有找到更简单的解决方案,所以这就是我所做的:

    由于我想避免更新我的所有表单,我将定义一个独立的助手。

    my_helpers.py

    from crispy_forms.helper import FormHelper
    
    class MyColFormHelper(FormHelper):
        label_class = 'col-sm-3'
        field_class = 'col-sm-9'
        form_tag = False
        disable_csrf = True
    

    由于我不想更新所有视图,因此我定义了一个上下文处理器来注入帮助程序

    my_context_processors.py

    from my_app.my_helpers import *
    
    def form_helpers(request):
        return {
            'col_form': MyColFormHelper()
        }
    

    现在我可以直接从模板中简单地指定助手

    <form action="my_action" method="my_method">{% csrf_token %}
        {% crispy my_form col_form %}
    </form>
    

    这也让我可以在不同的位置和布局中使用相同的表单。

    这并不能完全回答“默认类”的问题,但可以让我轻松部署助手。

    我不太喜欢的事情是,即使我们不需要帮助者,也会被注入。
    因此,请随时提出任何改进建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2019-07-31
      • 1970-01-01
      • 2012-06-16
      • 2015-02-02
      • 2016-12-20
      • 2014-05-09
      • 2013-10-19
      相关资源
      最近更新 更多