Django: встроенное редактирование связанной модели с использованием inlineformset

Я все еще застрял со встроенным древовидным редактированием связанных моделей на одной странице. У меня есть три модели: А, В и С.

Class A

Class B
    fb = foreignkey(A)

Class C
    fc = foreignkey(B)

В admin.py я делаю что-то вроде

AdminA
    inlines = [inlineB]

AdminB
    inlines = [inlineC]

Я хочу, чтобы, когда я редактирую/добавляю модель A, я мог добавить встроенную модель B и добавить записи модели C, связанные с моделью B. Я пробовал inlineformsets, но не могу понять, как их использовать для своих целей. Более того, я нашел это старое обсуждение той же проблемы. Но опять же, поскольку я новичок в Django, я не знаю, как заставить его работать.


person Neo    schedule 07.10.2010    source источник
comment
Что вы на самом деле пробовали до сих пор? Вы задали связанный вопрос 12 часов назад, в котором вы сказали, что модель B определяет просто отношение между A и C. Однажды у меня была аналогичная установка с моделями. от django-tagged, и он в основном работал с использованием GenericInlineAdminForm для TaggedItem, который также в основном определяет связь между тегами, помеченными объектами и типами контента. Однако вы не можете ожидать здесь полезного ответа, если будете задавать только довольно абстрактные вопросы.   -  person Bernd Petersohn    schedule 07.10.2010
comment
12 часов назад да B был абстрактным классом. Но не больше, я внес некоторые изменения в класс. Ранее я надеялся найти какое-нибудь встроенное решение, например всплывающее окно, которое появляется, если вы хотите создать объект foreginkey. Теперь я пытаюсь создать структуру типа inlineformset. Итак, в строке Inline я надеюсь, что помимо полей B я могу добавлять экземпляры объектов класса C. Итак, ищем индивидуальное решение для набора форм с использованием моделей, встроенных форм и т. Д. На самом деле моя проблема точно такая же, как и в ссылке, которую я упомянул. Можете ли вы заполнить меня деталями его решения?   -  person Neo    schedule 07.10.2010
comment
Пожалуйста, взгляните на docs.djangoproject.com/en/ 1.2/ref/contrib/admin/. Если вы определяете InlineAdminForm для модели B, например. полученный из admin.TabularInline, вы должны получить отображение формы с кнопками +, которые должны позволить вам создавать экземпляры C во всплывающем окне. Если это не сработает, проверьте внешние ключи. Вопрос, на который вы ссылаетесь, в основном имеет разумные ответы на вашу проблему.   -  person Bernd Petersohn    schedule 07.10.2010
comment
Бернд, спасибо за ответ. Но я думаю, вы неправильно поняли проблему. Мне нужно отредактировать/добавить экземпляры C со страницы добавления/редактирования A. Очевидно, что отредактировать/добавить C как встроенный в модель B работает с +, как вы упомянули. Но это проблема дерева, отредактируйте C на странице A. Я написал проблему абстрактно, чтобы уловить суть проблемы, которая заключалась в добавлении нового экземпляра A и одновременном добавлении B (и его объектов C ). Исходная проблема имеет хорошее решение, но многие части не завершены, тем более, что в ней использовался более старый django. Я опубликую полное решение, как только выясню это.   -  person Neo    schedule 07.10.2010
comment
Не совсем. Я имел в виду табличное встроенное отображение B на странице для A с возможностью добавления экземпляров C из встроенного отображения B. В моем случае B был списком тегов для статьи A с полями выбора для выбора тегов из существующих и кнопками «плюс» для создания и назначения новых тегов (C). Однако встроенного отображения для C на странице для A — в обход любого отображения B — добиться, вероятно, сложнее.   -  person Bernd Petersohn    schedule 07.10.2010


Ответы (1)


Немного странно отвечать на твой собственный вопрос, но эй, больше никто не откликнулся. И спасибо Бернду за то, что указал мне правильное направление. Решение потребовало создания промежуточной модели. Класс BC в моем случае.

class A(models.Model):                                        
a = models.IntegerField()                                 


class B(models.Model):                                        
    fb = models.ForeignKey(A)                                 
    b = models.IntegerField()                                 

class C(models.Model):                                        
    fc = models.ForeignKey(B)                                 
    c = models.IntegerField()                                 

class BC(models.Model):                                       
    fc = models.ForeignKey(A)                                 
    fb = models.ForeignKey(B)                                 

И вместо того, чтобы иметь InlineB в Admin модели A, используйте встроенную версию BC. Так выглядит полный admin.py.

class InlineC(admin.TabularInline):
    model = C
    extra = 1

class BCInline(admin.TabularInline):
    model = BC
    extra = 1

class AdminA(admin.ModelAdmin):
    fieldsets = [
        (None, {
            'fields': ('a',)
            }),
        ]
    inlines = [BCInline]

class AdminB(admin.ModelAdmin):
    fieldsets = [
        (None, {
            'fields': ('b',)
            }),
        ]
    inlines = [InlineC]

И вуаля, я получаю кнопку для всплывающего окна, чтобы создать полный объект B на странице добавления модели A.

person Neo    schedule 08.10.2010
comment
Какова цель наличия IntegerFields в моделях B и C? - person antihero; 20.06.2012
comment
это действительно всплывающее окно? Я так не думаю. - person andilabs; 25.03.2014