管理员动态删除字段的Django自定义表单

时间:2013-07-09 02:00:33

标签: django forms admin

问题是我有一个名为Gift的模型。它有一个布尔字段'giftbought',我想在创建对象时隐藏在管理界面中,并在更新时显示它。

我尝试制作一个表单,覆盖 init 方法,如:

class GiftForm(forms.ModelForm):
    giftbought = forms.BooleanField(label=u"Bought?", required=False)

    class Meta:
        model = Gift

    def __init__(self, *args, **kwargs):
        super(GiftForm, self).__init__(*args, **kwargs)
        if not self.instance.pk:
            del self.fields['giftbought']

但它对管理员不起作用,就像在说: Remove fields from ModelForm

我需要创建一个ModelAdmin类,重写get_form方法,但我不知道如何检查我是否is_instance ...

这将是:

class GiftAdmin(admin.ModelAdmin):
    model = Gift

    def get_form(self, request, obj=None, **kwargs):
        # that IF doesnt work!!!
        if not self.instance.pk:
            self.exclude = ('giftbought',)
        return super(GiftAdmin, self).get_form(request, obj=None, **kwargs)

admin.site.register(Gift, GiftAdmin)

任何提示?

1 个答案:

答案 0 :(得分:0)

绝对是你最好的选择ModelAdmin。我认为除了if测试之外,你做对了。

你应该能够这样做:

class GiftAdmin(admin.ModelAdmin):
    model = Gift

    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        # self.instance.pk should be None if the object hasn't yet been persisted
        if obj is None:
            self.exclude.append('giftbought')
        return super(GiftAdmin, self).get_form(request, obj, **kwargs)

admin.site.register(Gift, GiftAdmin)

请注意,方法代码有一些细微的变化。你应该check the docs,我确定你会在那里找到你需要的一切。

希望这有帮助!