如果 django 中的用户角色发生更改,则隐藏 User.ModelAdmin.fieldsets 之一

发布于 2025-01-15 01:31:04 字数 3155 浏览 1 评论 0原文

您好,如果用户角色发生变化,我想在管理中隐藏一些字段集。 在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文