【问题标题】:Django admin groups permissions and accessDjango 管理员组权限和访问
【发布时间】:2021-02-28 17:20:54
【问题描述】:

我正在寻找一种方法来自定义 Django 管理以支持基于用户组的权限和数据。

例如,我刚刚创建了 Developers1、Developers2 组。现在我还创建了 Transaction 模型,使用 AdminModel 来指定如何列出数据。

交易模型:

class Transaction(models.Model):
income_period_choices = (('Weekly', 'Weekly'), ('Fortnightly',
                                                'Fortnightly'))
chp_reference = models.CharField(max_length=50, unique=True)
rent_effective_date = models.DateField(null=True, blank=True)
income_period = models.CharField(max_length=11,
                                choices=income_period_choices,
                                null=True,
                                blank=True)
property_market_rent = models.DecimalField(help_text='Weekly',
                                        max_digits=7,
                                        decimal_places=2,
                                        null=True,
                                        blank=True)
*group = models.ForeignKey(Group, on_delete=models.CASCADE)

我不确定 *group 字段,我应该删除它,还是应该创建 Charfield,它不是 django.contrib.auth.group 模型的外键?

这是管理事务:

 @admin.register(Transaction)
 class TransactionAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super().save_model(request, obj, form, change)

def get_queryset(self, request):
    qs = super().get_queryset(request)
    # for s in qs:
    if request.user.is_superuser:
        return qs
    return qs.filter(group_name__in=Group)

search_fields = ['chp_reference','familymember__name']
inlines = [FamilyGroupInline,FamilyMemberInline]

我想要做的是我希望每个组只能访问自己的事务模型,并且每个组只能添加、删除、更新和查看自己的事务(例如,开发人员1 组无法访问开发人员2 事务,反之亦然)

任何想法都值得赞赏

谢谢!:)

【问题讨论】:

    标签: django model admin


    【解决方案1】:

    为此,您可以override the get_queryset method 仅返回与这些用户相关的对象(基于他们的权限、组或您想要的任何条件)。

    【讨论】:

    • 现在我应该创建一个新模型“组”以便我可以过滤吗?还是已经有一个了?找了好久
    • 你可以使用django内置的Group:docs.djangoproject.com/en/3.1/topics/auth/default/#groups
    • 我已经更新了这个问题,你能否提供一个更具体的方法来过滤 qs 以获得每个组的 qs