如何在 SelectDateWidget (Django 1.11) 中覆盖 template_name

How to override template_name in SelectDateWidget (Django 1.11)

我需要将字段包装在 div 中。 在 Django 1.10 中:

class CustomSelectDateWidget (SelectDateWidget):
    def render(self, name, value, attrs=None):
       ...
       output = []
       for field in self._parse_date_fmt():
            if field == 'year':
                output.append('<div class="input-field col s4">' + html['year'] + '</div>')
            elif field == 'month':
                output.append('<div class="input-field col s5">' + html['month'] + '</div>')
            elif field == 'day':
                output.append('<div class="input-field col s3">' + html['day'] + '</div>')
        return mark_safe('\n'.join(output))

它在 Django 1.11 中不起作用。 我试图覆盖 'django/forms/widgets/select_date.html':

class CustomDateWidget(SelectDateWidget):
    def get_template_names(self):
        return ['accounts/custom_select_date.html']

但 Django 包含 'django/forms/widgets/select_date.html' 而不是我的模板 'accounts/templates/accounts/custom_select_date.html'。没有显示错误消息。

使用 super 覆盖它,因为您正在使用 class 父级创建子级 class

form = super(CustomSelectDateWidget , self).get_form(form_class)

所以我找到了一个简单的方法来做到这一点。在我的例子中,我想在 ImageField 中显示图像。这是代码:

复制 django 的 clearable_file_input.html 模板,自定义并保存到,例如django_overrides/forms/widgets/clearable_file_input.html,例如:

{% if is_initial %}{{ initial_text }}: <img src="{{ widget.value.url }}" />{% if not widget.required %}
<input type="checkbox" name="{{ checkbox_name }}" id="{{ checkbox_id }}" />
<label for="{{ checkbox_id }}">{{ clear_checkbox_label }}</label>{% endif %}<br />
{{ input_text }}:{% endif %}
<input type="{{ widget.type }}" name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %} />

将原始小部件子类化,将 template_name 设置为您的新模板:

from django.forms import ClearableFileInput

class CustomClearableFileInputWidget(ClearableFileInput):
    template_name = 'django_overrides/forms/widgets/clearable_file_input.html'

更新您的表单以使用此小部件:

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['id', 'user']
        widgets = {
            'photo': CustomClearableFileInputWidget,
        }