Django一对多模型和管理内联

3

我将尝试在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 模型的每个字段拥有多个选择器,我的想法是使用多个选择器。

我在管理员应用程序中尝试实现的目标是,为 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(这似乎更符合我的用例),并应用此处找到的hack:http://www.mc706.com/tip_trick_snippets/18/django-manytomany-inline-admin/,但没有成功:/。
这应该很简单,但我担心django开发人员没有注意到这个用例?
谢谢!

外键是从“Provider”模型到“Selector”的。因此,您可以在“Selector”模型管理中拥有“Provider”内联。但是,在“Provider”模型管理中无法拥有“Selector”内联。 - Alasdair
那就是我想的:/ 我也尝试过http://www.mc706.com/tip_trick_snippets/18/django-manytomany-inline-admin/,但似乎不起作用(我将ForeignKey改为ManyToMany)。 - mitsest
1个回答

3

显然,在另一个模型页面内显示内联ManyToMany模型没有内置功能。

你可以将模型定义为如下:

models.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)

最终结果如下图所示:

多对多关系的内联管理界面

有一些失望,因为希望能获得文本输入框而不是下拉菜单(或者两者都有),这样就不需要点击加号添加选择器了...

我倾向于为管理员应用程序创建自己的小部件。

无论如何,感谢所有愿意阅读的人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接