在django模板中自定义ClearableFileInput

时间:2016-01-05 15:52:17

标签: 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 }}

其中{{ picture.clear-picture }}应生成复选框以删除旧图片

3 个答案:

答案 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并根据需要对其进行自定义。