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)