Django selectdatewidget如何手动渲染?

时间:2017-11-17 18:17:44

标签: django django-forms

我正在尝试手动渲染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>

1 个答案:

答案 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