我正在使用带有bootstrap 3的Django 1.7并希望以相同的方式呈现每个表单字段,最好利用bootstrap has-error字段:
<div class="form-group {% if form.field.errors %}has-error has-feedback{% endif %}">
<label class="control-label" for="field">{{ form.field.help_text }}</label>
<div class="input-group">
<span class="input-group-addon"><span class="some-icon"></span></span>
{% render_field form.field class+="form-control" placeholder=form.field.label id="end-date" aria-describedby="inputError2Status" %}
</div>
<label class="control-label" for="field">{{ form.field.errors.as_text }}</label>
</div>
正如你所看到的,当字段数量增加的那一刻它变成了很多工作,不仅是为了写它,而且还要维护它,重构变得很糟糕......不是真的干。对于每个字段,我需要更改form.field
变量和id="field"
以及图标
我如何编写函数,模板标签或其他东西以使django以这种方式渲染表单中的所有字段?甚至可以这样做吗?如果django中的Form有一个设置来接受渲染器将用于渲染图标的可选glypycon class
,那将是非常棒的。
- 编辑 -
如@Serafeim所示,django-crispy-forms可能是解决方案。但是如何使用crispy-forms来生成上面的html?
- 编辑2 -
在阅读了crispy-forms后,我设法提出了以下解决方案: 我的forms.py文件如下所示:
class CreateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CreateForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.form_action = 'submit'
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.html5_required = True
self.helper.layout = Layout(
PrependedText('fieldA', '<span class="fa fa-calendar"></span>', placeholder="yyyy-mm-dd"),
PrependedText('fieldB', '<span class="fa fa-clock-o"></span>', placeholder="0:00:00 (h:m:s)"),
'fieldC')
fieldA = forms.DateField(required=True)
fieldB = FDurationField(required=True)
fieldC = forms.CharField(widget=forms.Textarea(attrs={'rows':3}), required=False, max_length=128)
class Meta:
model = AModel
exclude = ('fieldD', 'FieldE', 'fieldF', 'fieldG')
在我的模板中,我只需要调用{% crispy form %}
,这比我的初始版本要好得多。但是,我仍然觉得我必须重复某些步骤,比如将字段添加到布局......是否可以进一步减少代码?
答案 0 :(得分:1)
如果django中的Form有一个设置,那将是很棒的 接受渲染器将用于渲染的可选glypycon类 图标。
表单只是字段的集合。 Field是widget(控制HTML呈现)和验证规则的组合。
要控制页面上呈现的内容,您需要修改小部件。
例如,如果我想指定一个css类或占位符,我会在小部件级别执行此操作:
email = forms.EmailField(label='Email Address',
required=False,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'user@example.com'}))
您可以创建自己的自定义小部件和字段,并获得对表单呈现方式的精细控制;所以你要的是绝对可能的;但由于这是经常重复的事情,django-crispy-forms已成为实现这一目标的事实标准方法。