因此,我自定义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不可迭代"错误。所以,我的问题是,我可以更方便地返回所有字段,以便逐个编写元组中的所有字段名称。
对于一项应该非常简单的任务感觉很辛苦。
感谢。
答案 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
这样超级用户应该获得所有字段。