代码之家  ›  专栏  ›  技术社区  ›  John McCollum

Django admin-编辑对象时删除字段

  •  6
  • John McCollum  · 技术社区  · 15 年前

    我有一个模型,可以通过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
    

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

    如果是这样的话,我可以破解一个JavaScript解决方案,但我觉得这样做根本不对!

    2 回复  |  直到 15 年前
        1
  •  6
  •   Mark Lavin    15 年前

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

    编辑:从John关于将字段设置为只读的评论中得到一个提示,您可以将此字段设置为隐藏字段并覆盖clean以确保值不会更改。

    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']  
    
        2
  •  0
  •   Community CDub    8 年前

    您还可以执行以下操作

    class FooAdmin(admin.ModelAdmin)
        def change_view(self, request, object_id, extra_context=None):       
            self.exclude = ('field_b', )
            return super(SubSectionAdmin, self).change_view(request, object_id, extra_context)
    

    从这里带走的 Django admin: exclude field on change form only