2016-02-04 97 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,因爲我期望獲得文本輸入而不是下拉(或者甚至兩者),所以我可以添加選擇器而無需單擊加號...

我傾向於創建自己的小部件管理員應用程序。

無論如何,感謝所有打擾讀者的人!