2016-02-04 96 views
2

我试图在Django定义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")) 

等等等等 的想法是让每个字段多个选择的提供者模型。

我试图在管理应用程序中实现的是,提供者模型的每个字段都有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 inline forms with multiple foreign keys

但错误现在是:

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

还试图改变我的关系多对多(这似乎更符合我的使用情况也一样),并应用在这里找到了破解:http://www.mc706.com/tip_trick_snippets/18/django-manytomany-inline-admin/,但没有运气:/

这应该是非常直截了当,但恐怕django开发者没有注意到这个用例?

谢谢!

+0

外键从'提供者'模型到'选择器'。因此,您可以在“Selector”模型管理员上使用Provider内联。但是,在'Provider'模型管理员中不能有'Selector'内联。 – Alasdair

+0

这就是我的想法:/ 我也尝试http://www.mc706.com/tip_trick_snippets/18/django-manytomany-inline-admin/,但它似乎不工作(我将ForeignKey更改为ManyToMany) – mitsest

回答

1

显然,没有内置的功能来在另一个模型页面内显示inline 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) 

,什么你会得到这个样子的: inline admin for manyToMany

这是一个令人失望的位t,因为我期望获得文本输入而不是下拉(或者甚至两者),所以我可以添加选择器而无需单击加号...

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

无论如何,感谢所有打扰读者的人!