Как мне добавить собственный встроенный виджет администратора в Django?

Это легко для не-встроенных. Просто переопределите следующее в вашем admin.py AdminOptions:

def formfield_for_dbfield(self, db_field, **kwargs):
    if db_field.name == 'photo':
        kwargs['widget'] = AdminImageWidget()
        return db_field.formfield(**kwargs)
    return super(NewsOptions,self).formfield_for_dbfield(db_field,**kwargs)

Я не могу понять, как адаптировать это для работы с инлайнами.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
0
8 549
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это работает точно так же. Классы TabularInline и StackedInline также имеют метод formfield_for_dbfield, и вы таким же образом переопределяете его в своем подклассе.

Дох! Я слишком усложнял вещи и возился с InlineFormsetFactory и тому подобным!

Andy Baker 12.01.2009 20:46

Обновлено: Забыть. Это была просто глупая ошибка с моей стороны.

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

class PictureInline(admin.StackedInline):
    model = Picture_Gallery
    extra = 3
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'name':
            kwargs['widget'] = MyWidget()
        return super(PictureInline,self).formfield_for_dbfield(db_field,**kwargs)

Начиная с Django 1.1, formfield_overrides также работает

formfield_overrides = {
    models.ImageField: {'widget': AdminImageWidget},
}

Проблема в том, что кажется, что он хочет добавить новое поле, когда default = установлен для чего-то во встроенном.

odinho - Velmont 08.12.2013 22:23

Другие вопросы по теме