0

私は分類モデルの魔女の多対多の関係を持つゲームのモデルを持っているが、複数の種類(PLATFORM、ジャンル、機能など)私は管理者からのtaxonomyフィールドを削除し、別の追加したい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_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フィールド私はこの2つの問題があります。

  1. 私はフィールドを追加しようとするとdynamicly私は明示的に彼らは空白

    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

私がコメントのために担当者を持っていないので、これは答えである必要があります。私は自分のプロジェクトで同じ問題を解決しようとしています。私が見つけた最良の解決策はチャドフによる自己回答の質問です: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

をレンダリングしているカスタムフィールドを追加しようとすると、私は解決するために、ホット見つける

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. 
  • エラーを受け取ります動的なMultipleChoiceFieldのデータを集計しますが、カスタム動的フィールドをModelFormに追加する適切なソリューションを探しています。

    1. は、私たちが初期化時にchoisesを渡す必要があり、既存の値となMultipleChoiceFieldを移入するには、次の

      forms.MultipleChoiceField(choices=choises) 
      
    2. 動的な方法で、私たちは__init__

      self.fields['dynamic_field_name'] = forms.MultipleChoiceField(choices=choises) 
      
      self.fieldsに私たちのフィールドを追加する必要があることを行うために、
    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)