我已经将profile_picture=ImageField
字段设置为初始值的表单。它使用ClearableFileInput
小部件。我需要在模板中自定义表单,因此我无法使用{{ form.profile_picture}}
。如何拆分字段元素并获得如下所示的内容:
{{ with picture=form.profile_picture }}
{{ picture.label_tag }}
<a href="{{ picture.url }}">
<img src="{{ picture.url }}">
</a>
{{ picture.clear-picture }}
其中{{ picture.clear-picture }}
应生成复选框以删除旧图片
答案 0 :(得分:3)
您可以覆盖ClearableFileInput
class CustomClearableFileInput(ClearableFileInput):
template_with_initial = (
'%(initial_text)s: <a href="%(initial_url)s">%(initial)s</a> '
'%(clear_template)s<br />%(input_text)s: %(input)s'
)
template_with_clear = '%(clear)s <label for="%(clear_checkbox_id)s">%(clear_checkbox_label)s</label>'
查看render
方法,
并在覆盖后设置
class ExForm(forms.Form):
image = ImageField(widget=CustomClearableFileInput)
答案 1 :(得分:2)
@vadimchin's answer是正确的,但是由于ClearableFileInput
类已更改,因此需要对Django新版本(2.0及更高版本)进行一些修改。
您必须通过在模板目录中创建另一个模板来覆盖template_name
的{{1}}属性。例如:
ClearableFileInput
然后用所需的代码填充customclearablefileinput.html,并根据需要修改模板的the original code。
您还必须在settings.py文件中进行更改,因此Django允许您从项目模板目录override widget templates:将class CustomClearableFileInput(ClearableFileInput):
template_name = 'widgets/customclearablefileinput.html'
添加到'django.forms'
,然后添加以下代码:
INSTALLED_APPS
答案 2 :(得分:0)
对我来说,另一种解决方案(基于@vadimchin的答案)则更容易覆盖template_name
中的参数class ClearableFileInput
。
您只需要在Forms.py中创建一个新类
from django.forms.widgets import ClearableFileInput
class CustomClearableFileInput(ClearableFileInput):
template_name = "your_path/custom_clearable_file_input.html"
field = forms.FileField(label = ... widget=CustomClearableFileInput(attrs={'placeholder': ...}))
然后在custom_clearable_file_input.html中,可以放入the django code并根据需要对其进行自定义。