Модель Django One-To-Many и встроенные администраторы

Я пытаюсь определить 2 модели в django следующим образом:

class Selector(models.Model):
    # A Beautiful Soup selector
    selector = models.CharField(max_length=ELEMENT_SELECTOR_MAX_LENGTH, null=True, blank=True)

    def __str__(self):
        return self.selector


class Provider(models.Model):
    # Articles' parent container selector
    articles_parent_container_selector = models.ForeignKey(Selector, related_name="articles_parent_container",
                                                          help_text=_("Beautiful Soup selector for all articles' "
                                                                      "parent container"))

    # Article's parent container selector
    article_parent_container_selector = models.ForeignKey(Selector, related_name="article_parent_container_selector",
                                                         help_text=_("Beautiful Soup selector for each article"))

и т. д. и т. д. Идея состоит в том, чтобы иметь более одного селектора для каждого поля модели Provider.

Чего я пытаюсь добиться в приложении администратора, так это встроенных строк charField для каждого поля модели поставщика.

Итак, мой admin.py похож на

from django.contrib import admin

from .models import Provider, Selector


class SelectorInline(admin.StackedInline):
    model = Selector


class ProviderAdmin(admin.ModelAdmin):
    inlines = [
        SelectorInline,
    ]

admin.site.register(Provider, ProviderAdmin)

я получаю ошибку

<class 'news_providers.admin.SelectorInline'>: (admin.E202) 'news_providers.Selector' has no ForeignKey to 'news_providers.Provider'.

я тоже пробовал

class SelectorInline(admin.StackedInline):
    model = Selector
    fk_name = 'articles_parent_container'

как описано здесь: встроенные формы Django с несколькими внешними ключами

но теперь ошибка:

<class 'news_providers.admin.SelectorInline'>: (admin.E202) 'news_providers.Selector' has no field named 'articles_parent_container'.

Также попытался изменить мое отношение к ManyToMany (что также кажется более подходящим для моего варианта использования) и применить хак, найденный здесь: http://www.mc706.com/tip_trick_snippets/18/django-manytomany-inline-admin/ , но не повезло:/

Это должно быть довольно прямолинейно, но я боюсь, что разработчики django не обратили внимание на этот вариант использования?

Спасибо!


person mitsest    schedule 04.02.2016    source источник
comment
Внешний ключ от модели Provider до Selector. Поэтому вы можете иметь встроенные провайдеры в администраторе модели Selector. Однако невозможно иметь Selector встроенных в администраторе модели Provider.   -  person Alasdair    schedule 05.02.2016
comment
Вот что я подумал:/ Я также пробовал mc706.com/tip_trick_snippets/ 18/django-manytomany-inline-admin , но, похоже, это не работает (я изменил ForeignKey на ManyToMany)   -  person mitsest    schedule 05.02.2016


Ответы (1)


Таким образом, очевидно, нет встроенных функций для отображения встроенной модели manyToMany внутри страницы другой модели.

Лучшее, что вы можете сделать, это определить модель так

модели.py

class Selector(models.Model):
    # A Beautiful Soup selector
    selector = models.CharField(max_length=70, null=True, blank=True)

class Provider(models.Model):

    # Articles' parent container selector
    articles_parent_container_selector = models.ManyToManyField(Selector, blank=True,
                                                                help_text=_("Beautiful Soup selector for all articles' "
                                                                            "parent container."),
                                                                related_name='articles_parent_container')

admin.py

class ArticlesParentContainerSelectorInline(admin.TabularInline):
    model = Provider.articles_parent_container_selector.through
    verbose_name = "Articles' parent container selector"

class ProviderAdmin(admin.ModelAdmin):
    inlines = [
        ArticlesParentContainerSelectorInline,

    ]
    exclude = ('articles_parent_container_selector',)

admin.site.register(Provider, ProviderAdmin)

и то, что вы получите, выглядит следующим образом: встроенный администратор для manyToMany

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

Я склоняюсь к созданию собственного виджета для приложения администратора.

В любом случае, спасибо всем, кто удосужился прочитать!

person mitsest    schedule 05.02.2016