2012-02-18 67 views
1

我使用自動管理員設置了一個基本的django網站,並使用'+'按鈕添加外鍵(植物),同時添加成分。但是,這些植物並沒有訂購,所以我不得不重寫表單字段,如下所示。Django 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',] 

如果您希望在表單中進行不同的排序,那麼更改queryset即可。請注意,不需要在表單中明確定義工廠字段 - 您可以在__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 2012-02-18 12:46:36

+0

你不能在多個字段中使用'formfield_for_foreignkey',但你可以按照描述覆蓋'__init__'方法。 – Alasdair 2012-02-18 12:58:13

+0

上面我得到'super(type,obj):obj必須是'super(IngredientAdmin,self).__ init __(* args,** kwargs)'行的類型實例或子類型。只需要清楚,我不需要使用上面的設置form = IngredientAdminForm? – Runcible 2012-02-18 13:06:46