Django : настройка текущего файла FileField в шаблонах

Я создаю простую форму с полем файла.

class ReviewForm(forms.ModelForm):

    class Meta:
        model = Review

        fields = [
            'file',
        ]

        widgets = {
            'file': forms.FileInput(attrs={'class': 'form-control'}),
        }

Во время рендеринга форма показывает Current file - xyz.pdf помимо ввода файла. enter image description here

Однако я не разрешаю прямой доступ к файлам. Все запросы проходят через функцию 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().

  1. Определите переменную template_name класса ClearableFileInput. Новый класс может быть создан в том же файле forms.py.

    .
class CustomClearableFileInput(ClearableFileInput):
  template_name = 'widgets/customclearablefileinput.html'
  1. Создайте новый файл widgets/customclearablefileinput.html в каталоге шаблонов.

  2. Заполните файл widgets/customclearablefileinput.html, изменив оригинальный код шаблона виджета в соответствии с вашими требованиями.

  3. Вы можете изменить тег href в customclearablefileinput.html, чтобы обернуть ссылку в analytics_logger.

    <a href="{% url 'analytics_logger' widget.attrs.analytics_logger_id %}"> {{ widget.value }} </a>

  4. Далее вы можете передать переменные как часть атрибутов формы, которые могут быть доступны для замены родного полного имени файла и настройки тега url.

    <a href="{% url 'analytics_logger' widget.attrs.analytics_logger_id %}"> {{ widget.attrs.filename }} </a>

  5. Для передачи переменных рекомендуется выполнить следующие шаги. Передайте переменные при инициализации формы в файле views.py

    .
    form = ReviewForm(instance= reviewform_instance, analytics_logger_id=reviewform_instance.pk, filename = reviewform_instance.filename)
  6. Далее переопределите метод init формы и обновите атрибуты поля.

    self.fields['processed_book'].widget.attrs.update( {'analytics_logger_id': analytics_logger_id, 'filename': filename,})
  7. Включите следующее в settings.py

    FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

  8. Добавьте 'django.forms' к INSTALLED_APPS в settings.py.

  9. Теперь вы можете включить новый переопределенный класс в виджет.

    class Meta:
        model = Review
    
        fields = [
            'file',
        ]
    
        widgets = {
            'file': CustomClearableFileInput(),
        }
    
Вернуться на верх