2012-02-18 13 views
1

自動管理者を使って基本的なdjangoサイトを設定しましたが、 '+'ボタンを使って外部キー成分。しかし、植物は注文されていないので、私は以下のようにフォームフィールドをオーバーライドしなければなりませんでした。Django admin - adminフォームフィールドを無効にするときに、外部キーのポップアップ '+'が表示されない

これは、ポップアップを開いた '+'ボタンが欠落していることを意味します。これを再入力する簡単な方法か、外部キーのドロップダウンを注文するより良い方法はありますか?ありがとう。

class IngredientAdminForm(forms.ModelForm): 
    plant = forms.ModelChoiceField(queryset=Plant.objects.order_by('name'), required=False) 

    class Meta: 
     model = Ingredient 


class IngredientAdmin(admin.ModelAdmin): 
    list_display = ('name', 'description', 'plant') 
    form = IngredientAdminForm 

答えて

1

最初に、モデルにdefault orderingを設定しましたか?管理者より注文を設定する方が理にかなっているかもしれません。

class Plant(models.Model): 
    name = models.CharField(max_length=30) 

    class Meta: 
     ordering = ['name',] 

フォームに別の注文が必要な場合は、クエリーセットを変更しても問題ありません。あなたのフォームにプラントフィールドを明示的に定義する必要はありません。__init__メソッドでクエリーセットを変更することができます。

class IngredientAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(IngredientAdminForm, self).__init__(*args, **kwargs) 
     self.fields['plant'].queryset = Plant.objects.order_by('name') 

    class Meta: 
     model = Ingredient 

Django管理者では、実際にカスタムモデルフォームを定義する必要はありません。モデルの管理方法formfield_for_foreignkeyを使用できます。

class IngredientAdmin(admin.ModelAdmin): 
    list_display = ('name', 'description', 'plant') 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "plant": 
      kwargs["queryset"] = Plant.objects.order_by('name') 
      return db_field.formfield(**kwargs) 
     return super(IngredientAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+0

ありがとうございます。これは同様の方法でManyToManyフィールドにも可能ですか? – Runcible

+0

多くのフィールドに 'formfield_for_foreignkey'を使うことはできませんが、' __init__'メソッドを上書きすることができます。 – Alasdair

+0

上記のように 'super(IngredientAdmin、self).__ init __(* args、** kwargs)'行の 'super(type、obj):objは型またはインスタンスのサブタイプでなければなりません。ちょうど明確にするために、私は上記のフォーム= IngredientAdminFormを設定する必要はありませんか? – Runcible

関連する問題