获取get_fields中的所有字段,而不填写所有字段名称的元组

时间:2016-11-24 08:26:33

标签: django django-admin

因此,我自定义Django管理面板并使用不同级别的访问权限创建不同的角色。对于不同的角色,我想为特定模型显示不同的字段。 例如,我们说我有以下模型:

class Venue(models.Model):
    venue_name = models.CharField(max_length=255)
    area = models.CharField(max_length=255)
    description = models.TextField()
    address = models.TextField()
    contact_info = models.CharField(max_length=100)
    email = models.EmailField()

此外,我扩展了Django User类并定义了一个名为user_type的字段,该字段采用整数值来定义用户角色。

现在,我想只显示user_type == 1的前两个字段以及user_type == 2的前四个字段。所以,我在admin.py中写了以下内容:

@admin.register(Venue)
class VenueAdmin(admin.ModelAdmin):
    def get_fields(self, request, obj=None):
        if request.user.user_type == 1:
            return ('sport','venue')
        elif request.user.user_type == 2:
            return ('sport', 'venue', 'description', 'address')

这对两个用户来说都很好。我面临的问题是,当我以超级用户身份登录时,我得到了一个" Nonetype不可迭代"错误。所以,我的问题是,我可以更方便地返回所有字段,以便逐个编写元组中的所有字段名称。

对于一项应该非常简单的任务感觉很辛苦。

感谢。

1 个答案:

答案 0 :(得分:2)

Nonetype is not iterable错误(我认为TypeError)表示您的get_fields没有返回任何内容。如果user.user_type不是1或2,则您的函数不会返回任何内容(实际上,返回None)。我建议按如下方式编辑它:

def get_fields(self, request, obj=None):
    if request.user.user_type == 1:
        return ('sport','venue')
    elif request.user.user_type == 2:
        return ('sport', 'venue', 'description', 'address')
    elif request.user.is_superuser:
        return super(VenueAdmin, self).get_fields(request, obj)
    else:
        return ()  # default case; up to you to decide

这样超级用户应该获得所有字段。