1. Я нашёл быстрое решение задачи отображения ImageField полей в виде картинок. Для редактирования записи - это formfield_overrides c ImageWidget из form_utils, а для списка записей - метод в модели, возвращающий <img ... с подставленными параметрами, и указание этого метода в списке list_display полей.

    Решение хоть и работает, но не нравится. Во-первых, приходится добавлять html представление поля из админки к наследникам models.Model, а не admin.ModelAdmin. Во-вторых, formfield_overrides кажется скорее хаком логики, хоть и документированным, чем логичным изменением представления.

    Как сделать красиво, неужели все-таки надо будет разобраться в admin шаблонах?

  2. Для list_display прекрасно работают методы ModelAdmin

  3. Иван Сагалаев

    07.03.2010

    1 ↑
    0 ↓

    Во-первых, приходится добавлять html представление поля из админки к наследникам models.Model, а не admin.ModelAdmin.

    То же будет работать и с ModelAdmin:

    class MyModelAdmin(ModelAdmin):
        list_display = ['image_tag']
    
        def image_tag(self, obj):
            return '<img src="%s">' % obj.image.url
        image_tag.allow_tags = True
    

    Во-вторых, formfield_overrides кажется скорее хаком логики, хоть и документированным, чем логичным изменением представления.

    А как иначе? Модель про своё представление в админке знать ничего не должна. У неё есть дефолтный виджет, который надо как-то заменить. Есть более глубокие средства: переопределить всю форму, переопределить метод formfield_for_dbfield и т.д. formfield_overrides — это просто удобный шорткат для самого частого случая.

  4. Аркадий, я пробовал, но неправильно определял метод, указывая один self аргумент. Соответственно получал ошибку.

    Иван, большое спасибо за пример. Мне (от незнания), казалось, что представление полей определяется в шаблонах, а на самом деле оказывается, что представление определяют виджеты, и это даже лучше :)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.