【问题标题】:Django custom forms for Admin deleting fields dynamically用于管理员动态删除字段的 Django 自定义表单
【发布时间】:2013-07-09 02:00:33
【问题描述】:

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

有什么提示吗?

【问题讨论】:

    标签: django forms admin


    【解决方案1】:

    您最好的选择肯定是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,我相信你会在那里找到你需要的一切。

    希望这会有所帮助!

    【讨论】:

    • 你好 Paulo.. 我试过了,插入和更新都出现错误:'GiftAdmin' object has no attribute 'pk'
    • 说的有道理,那你第一次得到它的方式呢? self.instance.pk?
    • 它只是更改为“if obj is None”! self.instance 也不存在。
    • 我明白了,太好了,我会修改答案。
    猜你喜欢
    • 2023-03-27
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多