0

我與分類模型巫多對多關係博弈模型有多種類型(PLATFORM,類型,特徵等)Django管理動態表單域人口

class Game(models.Model): 
    taxonomy = models.ManyToManyField(Taxonomy) 

class Taxonomy(models.Model): 
    TAXONOMY_ORDER = [ 
     'PLATFORM', 
     'GAME_PROCESS', 
     'GRAPHICS', 
     'GENRE', 
     'CATEGORY', 
     'FEATURE' 
    ] 
    type = models.CharField(choices=TAXONOMY_TYPES.items(), max_length=15) 

我想從管理員刪除taxonomy字段並添加獨立從TAXONOMY_ORDER

class GameAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(GameAdminForm, self).__init__(*args, **kwargs) 
     taxonomy_active = kwargs['instance'].taxonomy.all().values_list('id', flat=True) 

     for tax_type in Taxonomy. 
      self.fields['taxonomy_' + tax_type] = forms.MultipleChoiceField() 
      self.fields['taxonomy_' + tax_type].queryset = Taxonomy.objects.filter(type=tax_type) 
      self.Meta.fields.append('taxonomy_' + tax_type) 
      self.initial['taxonomy' + tax_type] = Taxonomy.objects.filter(
                id__in=taxonomy_active, 
                type=tax_type 
               ).values_list('id', flat=True) 

class GameAdmin(admin.ModelAdmin): 
    form = GameAdminForm 

    def get_fieldsets(self, request, obj=None): 
     fieldsets = super(GameAdmin, self).get_fieldsets(request, obj) 

     for tax_type in Taxonomy.TAXONOMY_ORDER: 
      fieldsets[0][1]['fields'] += ['taxonomy_' + tax_type] 

     return fieldsets 

每個分類型MultiplueChoises場我有兩個問題與此:

  1. 當我嘗試添加字段動態地我收到一個錯誤

    Unknown field(s) (taxonomy_FEATURE, taxonomy_PLATFORM, taxonomy_CATEGORY, taxonomy_GRAPHICS, taxonomy_GENRE, taxonomy_GAME_PROCESS) specified for Game. Check fields/fieldsets/exclude attributes of class GameAdmin. 
    
  2. 當我嘗試添加明確它們呈現空白的自定義字段

    class GameAdminForm(forms.ModelForm): 
        taxonomy_PLATFORM = forms.MultipleChoiceField() 
        taxonomy_GAME_PROCESS = forms.MultipleChoiceField() 
        taxonomy_GRAPHICS = forms.ChoiceField() 
        taxonomy_GENRE = forms.MultipleChoiceField() 
        taxonomy_CATEGORY = forms.MultipleChoiceField() 
        taxonomy_FEATURE = forms.MultipleChoiceField() 
    
        def __init__(self, *args, **kwargs): 
         ***__init__ stuff*** 
    

回答

0

我沒有對評論的代表,所以這個必須要一個答案。我一直在努力爲自己的項目解決同樣的問題,我發現的最好的解決方案是chadgh:How do I create and save dynamic fields in Django ModelAdmin?這個自我回答的問題。

我在我的代碼中試過這種方法。它完美的工作,我認爲它確實是你想要完成的。唯一需要注意的是在

def get_form(self, request, obj=None, **kwargs): 
    kwargs['fields'] = flatten_fieldsets(self.declared_fieldsets) 
    return super(PersonAdmin, self).get_form(request, obj, **kwargs) 

self.declared_fieldsets從Django 1.7開始已棄用。我用self.fieldsets代替,它工作正常。

主要困難在於ModelAdmin通常在表單的__init__執行之前從表單類獲取表單類中的字段,因此它看不到動態字段。這就是爲什麼你必須覆蓋ModelAdmin.get_form

+0

儘管有必要明確地放下現場設置中的所有字段,但這是現在最好的解決方案!謝謝! –

0

我找出熱點解決動態MultipleChoiceField填充數據,但仍在尋找向ModelForm添加自定義動態字段的正確解決方案。

  1. 與現有的值填充MultipleChoiceField我們需要傳遞choises在初始化:

    forms.MultipleChoiceField(choices=choises) 
    
  2. 做,在動態的方式,我們需要把我們的字段添加到self.fields__init__

    self.fields['dynamic_field_name'] = forms.MultipleChoiceField(choices=choises) 
    
  3. 要通過selected值:

    self.initial['dynamic_field_name'] = initial_value 
    

完整代碼:

class GameAdminForm(forms.ModelForm): 
    dynamic_field = forms.MultipleChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(GameAdminForm, self).__init__(*args, ** 


     choises = Taxonomy.objects.all().values_list('id', 'name') 
     self.fields['dynamic_field'] = forms.MultipleChoiceField(choices=choises) 
     self.initial['dynamic_field'] = active_id_list 

    class Meta: 
     model = Game 
     fields = '__all__' 


class GameAdmin(admin.ModelAdmin): 
    form = GameAdminForm 
    exclude = ['rating', '_id'] 

admin.site.register(Game, GameAdmin)