Django admin - 重写管理表单域时丢失外键弹出'+'
问题描述:
我使用自动管理员设置了一个基本的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
答
首先,你有没有为你的模型设置一个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)
谢谢,这很好。对于ManyToMany字段,这种方式也可能类似吗? – Runcible 2012-02-18 12:46:36
你不能在多个字段中使用'formfield_for_foreignkey',但你可以按照描述覆盖'__init__'方法。 – Alasdair 2012-02-18 12:58:13
上面我得到'super(type,obj):obj必须是'super(IngredientAdmin,self).__ init __(* args,** kwargs)'行的类型实例或子类型。只需要清楚,我不需要使用上面的设置form = IngredientAdminForm? – Runcible 2012-02-18 13:06:46