我在我的鸽子管理应用程序中实现了一个自定义用户模型,我希望允许用户仅编辑自己添加的鸽子。在后端,每个用户根据过滤器只能看到自己的鸽子。我的问题是,如果用户向 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/