Django crispy-forms包装都不起作用

时间:2014-12-19 20:15:06

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

为什么这不起作用? (Django 1.7和django-crispy-forms 1.4.0)

未应用css类。

class ResourceForm(ModelForm):

def __init__(self, *args, **kwargs):
    super(ResourceForm, self).__init__(*args, **kwargs)
    self.helper = FormHelper(self)
    self.helper.layout = Layout()
    self.helper.add_input(Submit('submit', 'Submit'))
    self.helper.all().wrap(Field, css_class="col-xs-3 col-sm-4")


class Meta:
    model = Resource
    fields = ['title',
              '....

然后是表单html:

 {% load crispy_forms_tags %}

{% block content %}
<div class="col-xs-12 col-sm-12 main_column">
    {% crispy form form.helper %}
</div>

{% endblock %}

生成的表单html如下所示:

<form  method="post"  enctype="multipart/form-data">
    <input type='hidden' name='csrfmiddlewaretoken' value='blaahblahblah...' /> 
    <div id="div_id_title" class="form-group">
        <label for="id_title" class="control-label  requiredField">
            Title<span class="asteriskField">*</span>
        </label>
        <div class="controls ">
            <input class="textinput textInput form-control" id="id_title" maxlength="255" name="title" type="text" value="Foo" /> 
        </div>
    </div>
....
</form>

即,ModelForm的正常html。 请注意,我使用的是forms.ModelForm,而不是forms.Form

1 个答案:

答案 0 :(得分:4)

当您使用

传递的表单致电FormHelper
self.helper = FormHelper(self)

它会自动创建一个包含所有字段的布局(see the code):

def __init__(self, form=None):
    self.attrs = {}
    self.inputs = []

    if form is not None:
        self.form = form
        self.layout = self.build_default_layout(form)    

但是当你打电话时

self.helper.layout = Layout()
你摧毁它。所以你没有要包装的字段。

解决方案:删除行self.helper.layout = Layout()