【问题标题】:django admin, how to check model instance belong to owner before deleting?django admin,如何在删除之前检查模型实例是否属于所有者?
【发布时间】:2018-07-19 22:22:17
【问题描述】:

我尝试覆盖 def has_delete_permission(self, request, obj=None):,但是在 Django Admin 中删除记录时没有传递 obj。

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 删除记录时肯定是通过了。请在上下文中显示您使用过的代码,并说明您如何确定它没有被通过。

标签: django django-admin


【解决方案1】:

型号

from django.contrib.auth.models import User

class Item(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    info = models.TextField()

查看

obj = Item.objects.get(id=1)
if obj.owner == request.user:
    obj.delete()

为了在 Django Admin 中执行此操作,您需要覆盖 admin.py 文件中的 delete_model 方法。对上述模型使用以下代码,以确保用户只删除自己的内容,而不会删除其他人的内容。

admin.py

class ItemAdmin(admin.ModelAdmin):
    def delete_model(self, request, obj):
        if obj.owner == request.user:
            obj.delete()
        return

admin.site.register(Item, ItemAdmin)

现在尝试从管理页面在模型中创建两个对象,并使用两个单独的用户作为所有者。您将只能删除您的内容,而不能删除其他内容。我检查了代码。这对我有用。

【讨论】:

  • 感谢您的回复。我使用的是管理员,而不是我自己的观点。
  • Pro Django 书中有一个非常复杂的解决方案。它适用于较旧的 Django 版本。因为您必须在模型文件中获取请求才能将当前所有者与当前用户进行比较。也不建议向模特提出要求。所以有一个并发症。如果我有什么事情,我会回复你的。谢谢。
  • @smallbee 请检查我的更新答案。这肯定会奏效。如果这对您有所帮助,请投票并接受答案。
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2019-05-15
  • 2015-09-28
相关资源
最近更新 更多