Полиморфные линейные модельные формы в Джанго - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть модель Person, у которой в качестве домашних животных есть много моделей животных. «Собака - это животное» с полем «любимая кость», а «Кошка - это животное» с «лайком кошачьей мяты?» поле и поле "любимой рыбы".

#models
class Person(db.model):
   pass

class Animal(db.model):
   models.ForeignKey(Person) #owner
   name = CharField()

class Dog(Animal):
   favorite_bone = CharField()

class Cat(Animal):
    favorite_fish = CharField()
    likes_catnip = BooleanField()

Я бы хотел встроить редактировать всех питомцев Persons, однако в форме администрирования Person я прочитал, что встроенные формы администрирования Django не поддерживают полиморфные встроенные формы [1], в этом случае вы получите только поля родительского класса (например, не поля fav__bone или favour_fish и likes_catnip.

Откуда эта проблема?

Какие изменения могут быть внесены в структуру, чтобы приспособиться к этому?

Если эти изменения не следует делать, почему бы и нет?

[1] http://www.mail-archive.com/django-users@googlegroups.com/msg66410.html

Ответы [ 3 ]

2 голосов
/ 27 октября 2013

(Это старый вопрос, но я решил добавить ответ, если он все еще полезен. Недавно я работал над аналогичным вопросом.)

Я считаю, что это будет сложноизменить генерацию форм Django, чтобы делать то, что вы хотите.Причина состоит в том, что встроенный набор форм использует один класс / форму для всех строк встроенного элемента - нет параметров конфигурации, которые оцениваются для каждой строки встроенной формы.Я убедился в этом, прочитав сам код - ищите «inline» и «formset» в django.contrib.admin.options.py, особенно строки 1039-1047 (версия 1.5.1).По этой же причине некоторые поля не могут быть доступны только для чтения в существующих элементах и ​​могут изменяться в новых элементах (см., Например, этот вопрос ).

Обходные пути, найденные дляслучай только для чтения включал пользовательский виджет, который производит желаемое поведение, такое как this .Это все еще не будет напрямую поддерживать полиморфизм, как бы то ни было.Я думаю, что вам нужно будет в конечном итоге сопоставить расходящиеся типы обратно с общим предком (например, иметь все классы питомцев, способные возвращать данные их уникальных атрибутов и значений), а затем создать один пользовательский виджет, который отображает полиморфную часть длявы.Затем вам нужно отобразить значения обратно при сохранении.

Это может быть более сложным, чем оно того стоит, и может привести к предложению в другом ответе не использовать admin для этого: -)

1 голос
/ 08 января 2012

может выглядеть здесь .

но я думаю, что modeladmin в настоящее время не может делать такие вещи. Вы можете создать собственный вид редактирования для вашей модели ... там почти все возможно.

0 голосов
/ 20 сентября 2011

Возможно сделать это с помощью Родовые отношения .

...