Как показать текущий файл в шаблонах с Django FileFields - PullRequest
3 голосов
/ 19 июня 2010

Я немного застрял, я уже некоторое время пользуюсь Django, но на самом деле не могу этого выяснить. И это странно, потому что это должно быть просто.

Я гуглил и не могу найти решение, возможно, потому что это просто.

Проблема в том, что у меня есть ModelForm, и у него есть FileField, когда я отрисовываю эту форму с экземпляром модели, а объект содержит загруженный файл, я хотел бы показать текущий файл (например, admin), но я не могу этого сделать.

Ни один из этих методов не работает:

{{ form.as_p }}
{{ field.label_tag }}

Я искал в шаблонах администраторов, но не могу найти магию. Форма корректно отображает все остальные данные объекта

Проблема № 2 состоит в том, что, поскольку загруженный файл не отображается при визуализации формы изменения с экземпляром объекта, формы не могут быть проверены при попытке сохранить, поскольку он ничего не знает о файле, который был ранее загружен.

Итак, как вы справляетесь с файловыми полями в форме изменений в Django, как показать текущий загруженный файл и как проверить форму.

Ответы [ 3 ]

6 голосов
/ 19 июня 2010

Вы не достаточно хорошо осмотрелись, решение - это собственный виджет в contrib / admin / widgets.py, а именно этот:

class AdminFileWidget(forms.FileInput):
    """
    A FileField Widget that shows its current value if it has one.
    """
    def __init__(self, attrs={}):
        super(AdminFileWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append('%s <a target="_blank" href="%s">%s</a> <br />%s ' % \
                (_('Currently:'), value.url, value, _('Change:')))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

Вы можете использовать это (или адаптированную версию), используя мета-опцию widgets ModelForms.

Насколько я знаю, вашей второй проблемы не должно быть вообще, даже без более приятного виджета, дайте ему знать, если она все еще сохраняется после использования пользовательского виджета.

1 голос
/ 11 августа 2017

Я не думаю, что ответ Беруика привлекает достаточное внимание в качестве комментария, но он действительно получил это, поскольку Джанго теперь исправляет это автоматически.

"Обычный ClearableFileInput из Django.forms делает это для меня."

См. Пример ниже.

models.py

class PosterForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PosterForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Poster

        fields = ('title', 'img')

        widgets = {
            'img' : forms.ClearableFileInput(),
            'title' : forms.TextInput()
        }
0 голосов
/ 19 июня 2010

Я использую этот фрагмент для отображения ImageFields (с дополнительным флажком для их удаления). Не знаю, как отображать поля, не относящиеся к изображениям, но, возможно, этот фрагмент даст вам вдохновение.

...