2

问题是我有一个名为 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']

但它不适用于管理员,就像它在中所说的那样: 从 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)

有什么提示吗?

4

1 回答 1

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)

请注意,方法代码有细微的变化。你应该检查文档,我相信你会在那里找到你需要的一切。

希望这可以帮助!

于 2013-07-09T02:18:34.813 回答