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

标签 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

假设我想在用户添加对象时显示 field_a 和 field_b,但如果用户正在编辑对象,则只显示 field_a。有没有一种简单的方法可以做到这一点,也许使用 fields 属性?

如果出现这种情况,我可以破解一个 JavaScript 解决方案,但这样做根本不合适!

最佳答案

您可以创建自定义 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

编辑:从约翰关于使字段只读的评论中得到提示,您可以将其设为隐藏字段并覆盖干净以确保该值不会更改。
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']  

关于Django admin - 如果编辑对象,则删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866896/

相关文章:

Django 条件管理 list_editable

django - 为什么 Django Admin 使用 commit=False 调用 UserCreationForm 保存方法?

python - 在/管理控制台中加载新模型时出现问题

Django 1.6 如何同时正确注释 Count() 和 Sum()?

python - django:自动检测数据库上所做的 CRUD 更改

django - 过滤多对多多选字段

python - Django 鹡鸰 'expected string or bytes-like object' 错误

python - 多个模型中的 Django 搜索字段

django - 使用 Django South 重置迁移历史记录的推荐方法是什么?

django - 如何将模型重新分配给不同的应用程序以仅在 Django Admin 中显示