如何在 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,
}
我需要将字段包装在 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,
}