Форма ImageField / FileField Django В настоящее время невозможно обрезать путь к имени файла

У меня есть ImageField, который хранится в AWS S3 (аналогично FileField). В форме у него есть эта метка «В настоящее время», которая показывает путь к файлу изображения. Я хотел бы обрезать и просто показать имя файла.

ссылаясь на последний ответ в Django: настройка значения FileField при редактировании модель, я все еще не могу заставить ее работать.

Он показывает «В настоящее время» с именем пути к файлу следующим образом: https://imgur.com/a/xkUZi

form.py

class CustomClearableFileInput(ClearableFileInput):
    def get_template_substitution_values(self, value):
        """
        Return value-related substitutions.
        """
        logging.debug("CustomClearableFileInput %s",value) <-- it never came here
        return {
            'initial': conditional_escape(path.basename(value.name)),
            'initial_url': conditional_escape(value.url),
        }

class CompanySettingEdit(forms.ModelForm):
    display_companyname = forms.CharField(max_length=50, required=True)    
    company_logo = forms.ImageField(widget=CustomClearableFileInput)

    class Meta:
        model = Company
        fields = ("display_companyname","company_logo")

модель.py

class Company(models.Model):
    display_companyname = models.CharField(max_length=50)    
    company_logo = models.ImageField(upload_to=upload_to('company_logo/'), blank=True, null=True, storage=MediaStorage())

Как я могу иметь что-то вроде этого: В настоящее время: filename.jpg

К вашему сведению - ImageField / FileField, я пробовал оба, это не имеет значения. Я использую Джанго == 1.11.7


person Axil    schedule 19.12.2017    source источник
comment
Можете ли вы также поделиться своим CustomClearableFileInput?   -  person DhiaTN    schedule 19.12.2017
comment
извините, забыл указать, это то же самое, что и ваш код. разница в мета у меня были поля company_logo. Если это имеет значение. Я отлаживаю CustomClearableFileInput, он никогда не заходил в эту функцию. Что-то не так при вызове?   -  person Axil    schedule 20.12.2017
comment
Какую версию Django вы используете!?   -  person DhiaTN    schedule 20.12.2017
comment
Я использую Джанго == 1.11.7   -  person Axil    schedule 20.12.2017


Ответы (1)


В Django 1.11.x get_template_substitution_values устарело. Новая реализация CustomClearableFileInput может быть следующей:

class CustomClearableFileInput(ClearableFileInput):
    def get_context(self, name, value, attrs):
        value.name = path.basename(value.name)
        context = super().get_context(name, value, attrs)       
        return context
person DhiaTN    schedule 20.12.2017
comment
оно работает. imgur.com/a/0NEgu, но одна проблема, ссылка сейчас не правильная. он указывает на текущую страницу (localhost:8000/employee/companysettings), хотя должен указывать на URL-адрес изображения (что-то вроде этого test-static.s3.amazonaws. com/media/company_logo/15/) - person Axil; 20.12.2017
comment
это не сработало, это то же самое, что и исходная проблема. он не обрезал imgur.com/a/qVF2i. - person Axil; 20.12.2017
comment
я заставил его работать с value.name = path.basename(value.name). отредактированный ответ. большое спасибо - person Axil; 20.12.2017
comment
Опасно изменять внутреннее состояние объекта, но, похоже, это единственный обходной путь, иначе вам придется переопределить HTML-шаблон виджета. Отличная работа! :+1: - person DhiaTN; 20.12.2017
comment
stackoverflow.com/questions/48314365/ @DhiaTN, не могли бы вы проверить мой последующий вопрос, почему-то это не полное решение. - person Axil; 19.01.2018
comment
Редактирование name не будет работать, т.к. URL генерируется с использованием name, поэтому ссылки будут недействительными. Правильный способ — использовать собственный шаблон. - person vikki; 08.05.2019