Настроить ClearableFileInput в шаблоне django

У меня есть форма с полем 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 }} должен сгенерировать флажок для удаления старой картинки


person warownia1    schedule 05.01.2016    source источник


Ответы (3)


ответ @vadimchin правильный, но требует небольшой модификации для новых версий Django (начиная с 2.0), поскольку ClearableFileInput изменился.

Вы должны переопределить атрибут template_name для ClearableFileInput, создав другой шаблон в каталоге шаблонов. Например:

class CustomClearableFileInput(ClearableFileInput):
    template_name = 'widgets/customclearablefileinput.html'

И заполните customclearablefileinput.html нужным кодом, изменив исходный код шаблона, который вам нужен.

Вам также необходимо внести изменения в файл settings.py, поэтому Django позволяет вам переопределить шаблоны виджетов из каталога шаблонов проектов: добавьте 'django.forms' в INSTALLED_APPS, а затем добавьте этот код:

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
person Fernando Jesus Garcia Hipola    schedule 20.10.2018

Вы можете переопределить 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) 
person vadimchin    schedule 06.01.2016

Другое решение (на основе ответа @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 можно поместить код django и настройте его по своему усмотрению.

person Ariel Reyes    schedule 03.10.2019