Django: условный ModelAdmin в зависимости от объекта

Допустим, у меня есть базовый класс, например:

class Base(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    value1 = models.CharField(max_length=50)
    value2 = models.CharField(max_length=50)

Теперь я ввожу в таблицу несколько типов объектов, некоторые из которых используют части данных, некоторые из которых используют другие части, причем все они используют какую-то общую часть (имя в этом примере).

Мне нужен полный список, но я хочу иметь разные представления при щелчке объекта, в зависимости от его типа. Изменения в modelAdmin включают в себя: один из классов использует inline, другие - нет, list_display меняется, у одного - дополнительный CSS, и т. Д., И т. Д. В основном мы говорим о различных modelAdmins.

Альтернативы, я думаю: один из них состоит в том, что каждый из этих типов подклассов Base, то есть:

class Type1(Base):
    pass

class Type2(Base):
    pass

а затем я определяю modelAdmin для каждого из них, и один для базового класса, чтобы получить таблицу со списком всего. В этом я бы переопределил ссылки, чтобы они не переходили в /app/base/id, а вместо этого в /app/type1/id, /app/type2/id и т. Д., В зависимости от типа. Для каждого из них я изменяю modelAdmins, чтобы после сохранения они возвращались в / app / type

Другой альтернативой было бы иметь одну модель и один modelAdmin и переопределять каждый отдельный метод, который я использую для change_view, чтобы определить, какой тип объекта он отображает, то есть get_inline_instances, get_formsets, все, что мне нужно для изменения list_display, list_display_links, list_filter, так далее.

Первый вариант выглядит для меня чище, хотя я не уверен, как изменить ссылку, кроме определения метода в modelAdmin с правильным вызовом reverse и добавления этого метода в качестве столбца в list_display.

Есть ли более простой способ, который я пропускаю? Как бы вы это сделали?

Да, и это должно было использовать админа. Я бы предпочел сделать это с помощью представлений или отдельных моделей, но, к сожалению, так оно и должно быть. Верховное командование хочет все в одной таблице.

Спасибо!.

Редактировать: также, я только что нашел это, и это выглядит хорошо:

http://django-polymorphic.readthedocs.org/en/latest/admin.html

1 ответ

Решение

Джанго-Полиморфный, безусловно, кажется, путь. Он прост в использовании и автоматически дает мне правильный modelAdmin, когда я щелкаю по базовому объекту, что я не мог воспроизвести с помощью Proxies.

Единственная проблема заключается в том, что таблица создается для каждого дочернего класса, даже если у дочернего класса нет дополнительных полей, и для дочернего класса выполняется дополнительный запрос, даже если из него ничего не восстанавливается (только столбец в таблице является сторонним ключ к базовому объекту).

Но это работает. Я могу жить с этим.

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