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.
Единственная проблема заключается в том, что таблица создается для каждого дочернего класса, даже если у дочернего класса нет дополнительных полей, и для дочернего класса выполняется дополнительный запрос, даже если из него ничего не восстанавливается (только столбец в таблице является сторонним ключ к базовому объекту).
Но это работает. Я могу жить с этим.