python - 如何让用户只能编辑自己创建的对象?

标签 python django

我在我的鸽子管理应用程序中实现了一个自定义用户模型,我希望允许用户仅编辑自己添加的鸽子。在后端,每个用户根据过滤器只能看到自己的鸽子。我的问题是,如果用户向 url 传递一个与数据库中的鸽子 pk 相对应的任意数字,则用户可以编辑数据库中的所有鸽子。

# Pigeon Model
    class Porumbei(models.Model):
        id_porumbel = models.AutoField(primary_key=True)
        data_adaugare = models.DateTimeField(default=timezone.now, null=True, blank=True)
        crescator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
        serie_inel = models.CharField(max_length=25, null=False, blank=False, unique=True,
                              help_text="Seria de pe inel. Ex: RO 123456")
        ...

# My url
    path('porumbei/editare/<int:pk>/', porumbei.views.editareporumbei, name='editareporumbei')



# I try somethin like this
    class Crescatori(admin.ModelAdmin):
        def has_change_permission(self, request, obj=None):
            if obj is not None and obj.crescator != request.user:
                return False
            return True

        def has_delete_permission(self, request, obj=None):
            if obj is not None and obj.crescator != request.user:
                return False
            return True

我使用需要登录来保护 View ,但我不知道如何拒绝用户编辑不属于他的鸽子。 '更巧合的是,假设用户 A 添加了一只 pk 5 的鸽子,用户 B 添加了一只 pk 6 的鸽子。使用我实现的 url,用户 A 可以在 url domain/porumbei/editare/5 编辑鸽子。如果用户B通过相同的url,他也可以编辑那只鸽子,但它不属于用户B。我怎样才能避免这种情况?提前致谢。

最佳答案

您问题中的网址/ View 不是管理页面。

如果您使用通用 UpdateView,您可以向 get_object 方法添加检查并引发 PermissionDenied错误

class PorumbeiUpdateView(UpdateView):

    def get_object(self, queryset=None):
        object = super().get_object(queryset=queryset)
        if object.crescator != self.request.user:
            raise PermissionDenied()
        return object

如果您有基于函数的 View ,则必须在从数据库获取对象后将检查放在函数的开头

def update_porembei(request, id):
    porembei = get_object_or_404(Porembei, id_porumbel=id)
    if porembei.crescator != self.request.user:
        raise PermissionDenied()

关于python - 如何让用户只能编辑自己创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341548/

相关文章:

python - 如何在 python 中从 tableau server 中删除工作簿

python - 删除 Elastic beanstalk EC2 实例时,celery 任务和队列是否会中断?

django - @property 的详细名称

python - 检查 django 权限或运算符(operator)?

django - 使用 mongoengine 保存 DateTimeField

django channel websocket 连接不工作

python - 使用带有嵌套 while 循环的 readline 方法时出现问题 Python

python - 在 Tkinter 中创建超链接

python - 添加内联后 Django 的运行服务器挂起。 1.8版本

Python:遍历多个列表并创建一个元组