如何在 Django 中自定义权限(而不是在 DRF 中)?

How customize permissions in django (not in DRF)?

如何在 view.py(CRUD classes)中为创建者(作者)自定义更新和删除对象的权限?我知道 classes LoginRequiredMixin 和 PermissionRequiredMixin,但我无法自定义它们以仅允许创建者(作者)更改确切对象。 我知道如何使用 class IsAdminOrReadOnly 在 DRF 中自定义权限,例如: permissions.py 在 DRF

class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return bool(obj.user == request.user or request.user.is_staff)

view.py 在 Django 中(没有 DRF)

class NewsUpdateView(LoginRequiredMixin, BaseMixin, UpdateView):
    form_class = NewsForm
    model = News
    template_name = 'news/news_update.html'

model.py 在 Django 中(没有 DRF)

class News(models.Model):
    title = models.CharField(max_length=128)
    content = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    photo = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
    is_published = models.BooleanField(default=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

问题是:如何在django中自定义权限(不是在DRF中)? 先感谢您。我希望你能给我一些建议,link 文章,或文档,或代码示例来解决这个问题。我已阅读 Custom users and permissions,但我不知道如何解决我的确切任务。

您可以在您的视图中使用 UserPassesTestMixin

from django.contrib.auth.mixins import UserPassesTestMixin

class NewsUpdateView(LoginRequiredMixin, UserPassesTestMixin, BaseMixin, UpdateView):
    form_class = NewsForm
    model = News
    template_name = 'news/news_update.html'

    def test_func(self):
        news = self.get_object()
        return news.user == self.request.user