将排除与 Django 字段集一起使用 [英] Using exclude with Django fieldsets

查看:28
本文介绍了将排除与 Django 字段集一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为模型编写一个动态表单,允许具有不同权限的用户做不同的事情.我希望以下代码能够正常运行,以便非超级用户无法编辑商家"块中的任何字段.

I'm trying to write a dynamic form for models that allow users with different permissions to do different things. What I would like is for the below code to function properly, so that non-superusers can't edit any of the fields in the 'Merchant' block.

class CategoryModelAdmin(LWModelAdmin):
    fieldsets = (
        ('Merchant', {'fields': ('merchant',) }),
        ('Category', { 'fields': ('name', 'parent',) }),
    )
    def get_form(self,request,obj=None, **kwargs): 
        if request.user.is_superuser:
            self.exclude = []
        else:
            self.exclude = ['Merchant']
        return super(CategoryModelAdmin,self).get_form(request, obj=None, **kwargs)

虽然我可以通过下面的代码实现这种效果,但我确实在寻找正确"的方法来做到这一点,感觉使用 exclude 是可行的方法,但我似乎无法做到无论我尝试什么.

While I can achieve that effect via the code below, I'm really searching for the "right" way to do it and it feels like using exclude is the way to go, but I can't seem to get it right no matter what I try.

class CategoryModelAdmin(LWModelAdmin):
    declared_fieldsets = None
    admin_fieldsets = (
        (None, {'fields': ('merchant',) }),
        ('Category', { 'fields': ('name', 'parent',) }),
    )
    restricted_fieldsets = (
        ('Category', { 'fields': ('name', 'parent',) }),
    )

    def get_fieldsets(self, request, obj=None):
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets
        else:
            fieldsets = self.restricted_fieldsets
        return LWModelAdmin.fieldsets + fieldsets

    def get_form(self, request, obj=None, **kwargs):
        self.declared_fieldsets = self.get_fieldsets(request, obj)
        return super(self.__class__, self).get_form(request, obj)

推荐答案

你的代码不是线程安全的,你不应该在你的自定义 ModelAdmin 中设置 self 的属性(self.exclude 等)方法.而是使用 ModelAdmin.get_formInlineModelAdmin.get_formset 的 kwargs 来获得你想要的.

Your code is not thread-safe, you shouldn't set attributes on self (self.exclude etc) in your custom ModelAdmin methods. Instead use kwargs of ModelAdmin.get_form and InlineModelAdmin.get_formset to get what you want.

这是一个简单的例子:

class CategoryModelAdmin(LWModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            kwargs['exclude'] = ['foo', 'bar',]
        else:
            kwargs['fields'] = ['foo',]
        return super(CategoryModelAdmin, self).get_form(request, obj, **kwargs)

这篇关于将排除与 Django 字段集一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆