首页 > 解决方案 > Django 管理错误 ValidationError: ['ManagementForm data is missing or has been tampered with'] 由于条件内联使用

问题描述

我有一个自定义User模型(AbstractUser)和一个Stock模型。假设有多个用户角色manager, supplier等。经理可以查看其他经理的详细信息和供应商详细信息

User模型有一个条件内联,如果用户角色等于 ,则supplier显示每个供应商的库存。(这里的角色是一个PositiveSmallIntegerField有选择和SUPPLIER = 2

class SupplierStockInline(admin.StackedInline):
    """ Inline to show stocks of a supplier """

    model = Stock
    extra = 0


@admin.register(User)
class UserAdmin(UserAdmin):
    """ User """

    fieldsets = [
        (None, {'fields': ('username', 'password')}),
        ('Personal info', {'fields': (
            'first_name',
            'last_name',
            'email',
            ... some custom fields...
        )}),
        ('Permissions', {'fields': (
            'is_active',
            'is_staff',
            'is_superuser',
            'role',
            'groups',
            'user_permissions',
        )}),
        ('Important dates', {'fields': ('last_login', 'date_joined')})
    ]

    list_display = [...]
    search_fields = [...]

    # --- the source of the problem ---

    inlines = []

    def get_inlines(self, request, obj):
        """ Show inlines, stocks of supplier """
        try:
            if obj.role == SUPPLIER:
                return [SupplierStockInline]
        except:
            pass
        return []
    # --- ---- -----

在我尝试将新用户的角色更改为supplier.

ValidationError: ['ManagementForm data is missing or has been tampered with']

问题是由于该覆盖的get_inlines()方法。当我注释掉它时,get_inlines()它工作正常,而且这只发生在角色身上supplier。我试图解决这个问题,但无法提出解决方案。

希望得到指导解决问题,先谢谢了。

标签: djangodjango-modelsdjango-admindjango-admin-tools

解决方案


经过数小时的研究终于找到了解决方案,尽管我无法准确解释为什么会发生这种情况(可能与没有相关的库存实例以及在更改为角色供应商时突然与库存实例有关系有关)。

无论如何,不​​是覆盖get_inlines()方法,而是覆盖change_view()并使用条件方法可以解决问题,

class UserAdmin(admin.ModelAdmin):
    ...
    inlines = []

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inlines = []
    
        try:
            obj = self.model.objects.get(pk=object_id)
        except self.model.DoesNotExist:
            pass
        else:
            if obj.role == SUPPLIER:
                self.inlines = [SupplierStockInline,]
        return super(UserAdmin, self).change_view(request, object_id, form_url, extra_context)

推荐阅读