【问题标题】:list_display rows in a table conditionally djangolist_display 有条件地显示表中的行 django
【发布时间】:2020-06-07 19:27:08
【问题描述】:

我有两张桌子

Employee
-----
username
organisation_id
email

Organisation
------------
organisation_id
company_name

User_A->organisation_1
User_B->organisation_1
User_C->organisation_2
User_D->organisation_2

当 user_A 登录时,他应该只看到 User_A 和 User_B 此代码应如下所示, 逻辑是首先我们需要找到当前用户组织并有条件地在管理页面中显示结果 Django 管理代码

admin.site.register(Employee, CustomUserAdmin)
admin.site.register(Organization)
class CustomUserAdmin(UserAdmin):
def filter_view(request):
current_user = request.user
organization_id =employees.objects.get(id=current_user.id).organization_id
List_display = ('username', 'email','Organizations.objects.filter(id=organization_id)')

【问题讨论】:

    标签: python django conditional-statements admin customization


    【解决方案1】:

    我回答这个问题是为了帮助别人,我为多种用户类型修改了这样的代码,这段代码将帮助你解决这种情况,这样只有与部门相关的用户才能看到其他用户,但超级用户可以控制所有人。感谢@ruddra 和@MK Patel 的宝贵努力。

    >     class RestrictedFormAdmin(admin.ModelAdmin):
    >         class Meta:
    >             model = Employee
    >         def get_queryset(self, request):
    >             if request.user.is_superuser:
    >                 return super().get_queryset(request)
    >             return super().get_queryset(request).filter(organization_id=request.user.employee.organization_id)
    > 
    >     admin.site.register(Employee,RestrictedFormAdmin)
    

    【讨论】:

      【解决方案2】:

      你可以覆盖get_queryset(request)方法:

      我假设您在员工和用户之间存在一对一的关系

      class Employee(models.Model):
         user = models.OneToOneField(User)
      

      然后像这样覆盖ModelAdmin 类:

      class CustomUserAdmin(UserAdmin):
           def get_queryset(self, request):
              return super().get_queryset(request).filter(organisation_id=request.user.employee.organisation_id)
      

      【讨论】:

      • 在请求上下文之外工作。发生错误
      • 那么请consider marking it as accepted。谢谢。
      • 非常感谢。我在这里粘贴我的代码以帮助其他人 ''class RestrictedFormAdmin(admin.ModelAdmin): class Meta: model = Employee def get_queryset(self, request): if request.user.is_superuser: return super().get_queryset(request ) return super().get_queryset(request).filter(organization_id=request.user.employee.organization_id) admin.site.register(Employee,RestrictedFormAdmin)''
      【解决方案3】:

      你可以写list_display是...

      list_display = ('username', 'email', 'filtered_organisation')
      

      并编写如下过滤组织的方法...

      def filtered_organisation(self, obj):
          return Organizations.objects.filter(id=organization_id)
      

      更多参考click here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2013-04-28
        • 1970-01-01
        • 2017-07-26
        相关资源
        最近更新 更多