Django admin - 重写管理表单字段时缺少外键弹出'+'

时间:2012-02-18 12:05:32

标签: django

我使用自动管理员设置了一个基本的django网站,并在添加一个成分时使用“+”按钮添加外键(植物)。但是,工厂没有订购,所以我必须覆盖表格字段,如下图所示。

看起来虽然这样做意味着打开弹出窗口的“+”按钮已经丢失了 - 是否有一种简单的方法可以重新包含它,或者更好的方式我应该订购外键下拉列表?感谢。

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 个答案:

答案 0 :(得分:1)

首先,您为模型设置了default ordering吗?在那里设置排序可能比在admin中更有意义。

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

    class Meta:
        ordering = ['name',]

如果您想在表单中使用不同的顺序,则更改查询集即可。请注意,out不需要在表单中明确定义工厂字段 - 您可以在__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)