我正在尝试手动渲染django中的selectdatewidget,以便我可以使用bootstrap进行自定义。但是我不清楚如何使用selectdatewidget渲染单个输入?
class ProfileForm(forms.Form):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
eighteen_years_from_now = (datetime.datetime.now().year - 18)
date_of_birth = FieldBuilder(User, 'date_of_birth', widget=SelectDateWidget(
years=range(eighteen_years_from_now, 1919, -1)))
用于呈现单个字段的模板:
<div class="form-group">
<label for="{{ field.id_for_label }}" class="sr-only">
{{ field.label }}
</label>
{% if form.is_bound %}
{% if field.errors %}
{% render_field field class="form-control is-invalid" %}
{% for error in field.errors %}
<div class="invalid-feedback">
{{ error }}
</div>
{% endfor %}
{% else %}
{% render_field field class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field field class="form-control" placeholder=field.label %}
{% endif %}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text }}</small>
{% endif %}
</div>
答案 0 :(得分:3)
简短的回答是,如果不覆盖内置的django模板,则无法获得所需的控件。
值得庆幸的是,Django 1.11将widget系统更改为使用模板而不是python代码,这使得更容易覆盖。
通过查看django/forms/templates/django/forms/widgets
中的模板,我们可以看到选择日期窗口小部件加载了多个窗口小部件模板,每个子窗口小部件都会加载窗口小部件模板:
{% for widget in widget.subwidgets %}{% include widget.template_name %}{% endfor %}
对于选择日期小部件,这意味着输出是彼此相邻的3个选择标记(月,日,年)。这不能与引导程序内联,因为每个<select>
都需要用div
包含适当的css class
。
可以通过以下django文档覆盖模板: https://docs.djangoproject.com/en/1.11/ref/forms/renderers/#overriding-built-in-widget-templates