在 django 模板中自定义 ClearableFileInput

war*_*ia1 3 django django-forms django-widget

我有一个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 }}
Run Code Online (Sandbox Code Playgroud)

{{ picture.clear-picture }}应该在哪里生成复选框以删除旧图片

Fer*_*ola 6

@vadimchin 的答案是正确的,但它需要对 Django 的新版本(2.0 及更高版本)进行一些修改,因为ClearableFileInput类已更改。

您必须通过在模板目录中创建另一个模板来覆盖 , 的template_name属性ClearableFileInput。例如:

class CustomClearableFileInput(ClearableFileInput):
    template_name = 'widgets/customclearablefileinput.html'
Run Code Online (Sandbox Code Playgroud)

并用需要的代码填充customclearablefileinput.html,根据需要修改模板的原始代码

您还必须在 settings.py 文件中进行更改,以便 Django 允许您覆盖项目模板目录中的小部件模板:添加'django.forms'INSTALLED_APPS,然后添加以下代码:

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
Run Code Online (Sandbox Code Playgroud)


小智 4

您可以覆盖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>'
Run Code Online (Sandbox Code Playgroud)

render方法,

并在覆盖后,设置

  class ExForm(forms.Form):
       image = ImageField(widget=CustomClearableFileInput) 
Run Code Online (Sandbox Code Playgroud)