Django : настройка текущего файла FileField в шаблонах
Я создаю простую форму с полем файла.
class ReviewForm(forms.ModelForm):
class Meta:
model = Review
fields = [
'file',
]
widgets = {
'file': forms.FileInput(attrs={'class': 'form-control'}),
}
Во время рендеринга форма показывает Current file - xyz.pdf
помимо ввода файла.
Однако я не разрешаю прямой доступ к файлам. Все запросы проходят через функцию analytics_logger перед загрузкой файла.
Итак, я хочу настроить Current file
html из
Current file - <a href="{0}">{1}</a>
к
Current file - <a href="{% url 'analytics_logger' {0} %}">{1}</a>
Как я могу сделать это в Django 3.x?
Следующие шаги рекомендуются в случае CustomClearableFileInput()
.
Определите переменную
.template_name
классаClearableFileInput
. Новый класс может быть создан в том же файле forms.py.
class CustomClearableFileInput(ClearableFileInput):
template_name = 'widgets/customclearablefileinput.html'
Создайте новый файл
widgets/customclearablefileinput.html
в каталоге шаблонов.Заполните файл
widgets/customclearablefileinput.html
, изменив оригинальный код шаблона виджета в соответствии с вашими требованиями.Вы можете изменить тег href в
customclearablefileinput.html
, чтобы обернуть ссылку в analytics_logger.<a href="{% url 'analytics_logger' widget.attrs.analytics_logger_id %}">
{{ widget.value }}
</a>
Далее вы можете передать переменные как часть атрибутов формы, которые могут быть доступны для замены родного полного имени файла и настройки тега url.
<a href="{% url 'analytics_logger' widget.attrs.analytics_logger_id %}">
{{ widget.attrs.filename }}
</a>
Для передачи переменных рекомендуется выполнить следующие шаги. Передайте переменные при инициализации формы в файле views.py
.form = ReviewForm(instance= reviewform_instance, analytics_logger_id=reviewform_instance.pk, filename = reviewform_instance.filename)
Далее переопределите метод init формы и обновите атрибуты поля.
self.fields['processed_book'].widget.attrs.update( {'analytics_logger_id': analytics_logger_id, 'filename': filename,})
Включите следующее в settings.py
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
Добавьте
'django.forms'
кINSTALLED_APPS
вsettings.py
.Теперь вы можете включить новый переопределенный класс в виджет.
class Meta: model = Review fields = [ 'file', ] widgets = { 'file': CustomClearableFileInput(), }