2015-09-11 31 views
1

我有一些問題,配置在Django管理下設置的更多。使用動態創建的類別作爲Django管理站點模型和註冊模型不止一次

設置:

可以說我有以下Django模型:

class Food(models.Model): 
    section = models.ManyToManyField(Section, related_name='foods') 
class Fruit(Food): 
    pass 
class Meat(Food): 
    pass 

然後另一種模式,它允許最終用戶給出自定義名稱的部分,並分配相應的模型,該節:

class Section(models.Model): 
    FOOD = 'FO' 
    FRUIT = 'FR' 
    MEAT = 'ME' 
    MODEL_CHOICES = (
     (FOOD, 'Food'), 
     (FRUIT, 'Fruit'), 
     (MEAT, 'Meat'), 
    ) 
    name = models.CharField(max_length=20) 
    model = models.CharField(max_length=2, 
          choices=MODEL_CHOICES, 
          default=FIELDS) 

用戶在數據庫中定義了以下自定義部分:

name = Oranges   model = Fruit 
name = Apples & Pears model = Fruit 
name = Organic beef  model = Meat 
name = Regular beef  model = Meat 

目前:

在管理我們得到如下:

Foods 
Meats 
Fruits 
Sections 

管理使我們能夠增加肉類或水果,並將其分配給一個自定義的部分,但這需要數據輸入的人知道橙子是一種水果或肉類。我只是不願意留給偶然的機會,你知道..

例如目前的行動順序是這樣的:

admin -> add Fruit item -> Name it Blood Orange & assign it to the Oranges section 

我想怎麼辦:

我希望管理員列出自定義部分的名稱,以便用戶可以選擇將項目添加到這些用戶創建的部分之一:

Oranges (user defined) 
Apples & Pears (user defined) 
Organic beef (user defined) 
Regular beef (user defined) 
Sections 

現在,當用戶選擇通過管理成果形式爲橙色添加到數據庫將提供和有機牛肉將提供肉形式。因此,操作順序爲:

admin -> add Orange -> Name it Blood Orange 

我當然可以寫這樣的自定義接口,但我希望這可以很容易地在Django管理接口來實現?

+0

你能更清晰,或精確,或更復雜的與你所需的輸出?我想你可以通過動態創建管理員類來完成,其中一個基類繼承了常用屬性,一些字段基於從模型中提取的值 – kicker86

+0

@ kicker86請參閱上面修改的問題。我希望這有助於澄清。如果您有具體問題,請告訴我。 – arctelix

回答

0

由於proxy classes我能得到確切的結果,我一直在尋找很容易(admin.py):

def create_proxy_admin(model_admin, model, name = None): 
    # Create a proxy class for the specified model 
    class Meta: 
     proxy = True 
     app_label = model._meta.app_label 

    attrs = {'__module__': '', 'Meta': Meta} 
    proxy_model = type(name, (model,), attrs) 

    # Register the proxy model with model_admin 
    admin.site.register(proxy_model, model_admin) 

for section in Section.objects.all(): 
    name = str(section.name.capitalize()) 

    # Define any attributes for the admin 
    # Could be modified for each section as required! 
    admin_attrs = {'list_display': ('some_field',), 
        } 

    # Select the appropriate model 
    if section.model == section.FRUIT: 
     Model = Fruit 
    elif section.model == section.MEAT: 
     Model = Meat 
    else: 
     Model = Food 

    # Create ModelAdmin class 
    Admin = type(name+'Admin', (admin.ModelAdmin,), admin_attrs) 

    # Create proxy model and register with admin 
    create_proxy_admin(Admin, name=name, model=Model) 

基本上每個部分,動態地適當的模型創建一個代理類。在該部分之後命名。然後爲每個部分創建一個admin.ModelAdmin類。最後向管理員註冊。簡單!

我將在一週左右的等待接受這個答案,以防萬一有人有更好的方法或看到任何潛在的問題之前。

它已經快一個月了,所以我想這是它..