Django admin - 如果编辑对象,删除字段

Joh*_*lum 6 django django-admin

我有一个可以通过Django管理区访问的模型,如下所示:

# model
class Foo(models.Model):
    field_a = models.CharField(max_length=100)
    field_b = models.CharField(max_length=100)

# admin.py
class FooAdmin(admin.ModelAdmin):
    pass
Run Code Online (Sandbox Code Playgroud)

假设我想在用户添加对象时显示field_a和field_b,但如果用户正在编辑对象,则只显示field_a.是否有一种简单的方法可以使用fields属性?

如果遇到它,我可能会破解JavaScript解决方案,但根本不这样做是不对的!

Mar*_*vin 6

您可以ModelForm为管理员创建自定义以删除该字段__init__

class FooForm(forms.ModelForm):
    class Meta(object):
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            # Since the pk is set this is not a new instance
            del self.fields['field_b']

class FooAdmin(admin.ModelAdmin):
    form = FooForm
Run Code Online (Sandbox Code Playgroud)

编辑:从约翰关于使字段只读的评论中得到一个提示,你可以将它作为一个隐藏字段并覆盖清理以确保值不会改变.

class FooForm(forms.ModelForm):
    class Meta(object):
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            # Since the pk is set this is not a new instance
            self.fields['field_b'].widget = forms.HiddenInput()

    def clean_field_b(self):
        if self.instance and self.instance.pk:
            return self.instance.field_b
        else:
            return self.cleaned_data['field_b']  
Run Code Online (Sandbox Code Playgroud)