如果 django 中的用户角色发生更改,则隐藏 User.ModelAdmin.fieldsets 之一
您好,如果用户角色发生变化,我想在管理中隐藏一些字段集。 在 get_queryset()
中,如果 role == 'CMS'
我正在更改查询集,我还想隐藏同一角色的 Permission
字段集。 这是我的管理员:
注意:我在此处使用字段集列表,我粘贴了 touples
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Permission
from .models import BankAccount
from addresses.models import Address
User = get_user_model()
class AddressInline(admin.TabularInline):
model = Address
extra = 0
@admin.register(User)
class UserAdmin(BaseUserAdmin):
list_display = (
'id', 'full_name', 'email', 'gender', 'role',
)
list_filter = (
'gender', 'is_staff', 'is_superuser', 'is_active',
)
list_display_links = (
'full_name', 'email',
)
search_fields = (
'email', 'first_name', 'last_name', 'phone_number',
)
readonly_fields = (
'created', 'updated',
)
ordering = ('first_name', 'email', 'last_name',)
fieldsets = [
['Credentials', {'fields': ['email', 'phone_number', 'password']}],
['Info', {'fields': ['first_name', 'last_name', 'gender', 'role', 'profile_pic', 'created', 'updated']}],
]
add_fieldsets = (
('Credentials', {'fields': ('email', 'phone_number', 'password1', 'password2')}),
('Info', {'fields': ('first_name', 'last_name', 'gender', 'role', 'profile_pic')}),
('Permissions', {'fields': ('is_vendor', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
)
inlines = (AddressInline,)
def full_name(self, obj=None):
return f'{obj.first_name} {obj.last_name}'
def get_queryset(self, request):
if request.user.role == 'CMS':
return self.model.objects.filter(
role='CUSTOMER', is_staff=False, is_superuser=False
)
else:
return self.model.objects.all()
admin.site.register(Permission)
admin.site.register(BankAccount)
在此管理员中,在 get_queryset()
中,如果角色是,我将更改查询集“CMS”。 就像我不想显示 fieldsets
选项中的 Permission
部分一样。
我尝试了一些列表选项和一些技巧,例如下面的示例函数:
def get_queryset(self, request):
if request.user.role == 'CMS' and request.user.is_superuser==False:
if not any('Permissions' in set for set in self.fieldsets):
self.fieldsets += [['Permissions', {'fields': ['is_active',]}]]
return self.model.objects.filter(
role='CUSTOMER', is_staff=False, is_superuser=False
)
else:
if not any('Permissions' in set for set in self.fieldsets):
self.fieldsets += [['Permissions', {'fields': ['is_vendor', 'is_staff', 'is_superuser', 'is_active', 'groups', 'user_permissions']}]]
return self.model.objects.all()
这在我的本地计算机中提供了结果,但在生产服务器中却没有。在生产服务器中,即使添加了条件,permission
部分也会重复。
这是因为我将其添加到 list_user
页面中,而不是添加到管理的 change_user
页面中。如果是这样..那么我该如何解决这个问题?
我怎样才能做到这一点? 提前致谢
Hi I want to hide some fieldsets in admin if user role changes.
In get_queryset()
I'm changing queryset if role == 'CMS'
I also want to hide Permission
fieldset for same role.
Here is my admin:
Note: I'm Using list for fieldsets here I pasted touples
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Permission
from .models import BankAccount
from addresses.models import Address
User = get_user_model()
class AddressInline(admin.TabularInline):
model = Address
extra = 0
@admin.register(User)
class UserAdmin(BaseUserAdmin):
list_display = (
'id', 'full_name', 'email', 'gender', 'role',
)
list_filter = (
'gender', 'is_staff', 'is_superuser', 'is_active',
)
list_display_links = (
'full_name', 'email',
)
search_fields = (
'email', 'first_name', 'last_name', 'phone_number',
)
readonly_fields = (
'created', 'updated',
)
ordering = ('first_name', 'email', 'last_name',)
fieldsets = [
['Credentials', {'fields': ['email', 'phone_number', 'password']}],
['Info', {'fields': ['first_name', 'last_name', 'gender', 'role', 'profile_pic', 'created', 'updated']}],
]
add_fieldsets = (
('Credentials', {'fields': ('email', 'phone_number', 'password1', 'password2')}),
('Info', {'fields': ('first_name', 'last_name', 'gender', 'role', 'profile_pic')}),
('Permissions', {'fields': ('is_vendor', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
)
inlines = (AddressInline,)
def full_name(self, obj=None):
return f'{obj.first_name} {obj.last_name}'
def get_queryset(self, request):
if request.user.role == 'CMS':
return self.model.objects.filter(
role='CUSTOMER', is_staff=False, is_superuser=False
)
else:
return self.model.objects.all()
admin.site.register(Permission)
admin.site.register(BankAccount)
In this admin, in get_queryset()
here I'm changing the queryset if role is "CMS".
Same like that I don't want to display Permission
section from fieldsets
option.
I have tried some list options and some tricks like in bellow sample function:
def get_queryset(self, request):
if request.user.role == 'CMS' and request.user.is_superuser==False:
if not any('Permissions' in set for set in self.fieldsets):
self.fieldsets += [['Permissions', {'fields': ['is_active',]}]]
return self.model.objects.filter(
role='CUSTOMER', is_staff=False, is_superuser=False
)
else:
if not any('Permissions' in set for set in self.fieldsets):
self.fieldsets += [['Permissions', {'fields': ['is_vendor', 'is_staff', 'is_superuser', 'is_active', 'groups', 'user_permissions']}]]
return self.model.objects.all()
This gives me results in my local machine but not in production server. In production server the permission
section get repeated even if then condition added.
Is this because I'm adding this in list_user
page and not in change_user
page of admin. If so.. then How can I fix this?
How can I achieve that?
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论