Django 管理员:“删除”操作忽略了 has_delete_permission

2023-12-19

假设我有一个模型,其中 ID 为 1 的行很特殊,不应该被删除,但所有其他行都可以删除。这是我实现该逻辑的尝试:

模型.py

from django.db import models


class Widget(models.Model):
    name = models.CharField(max_length=255)

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name

admin.py

from django.contrib import admin

from .models import Widget


class WidgetAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        return obj is None or obj.pk != 1

admin.site.register(Widget, WidgetAdmin)

上面的代码从更改表单中删除“删除”按钮obj.pk is 1,这就是我想要的。但是,在更改列表中,如果我选中 ID 为 1 的行的复选框,然后使用“删除选定的小部件”操作,我就可以删除该行。我想防止这种情况发生,但仍然允许使用“删除选定的小部件”操作删除所有其他行。我怎样才能做到这一点?


根据has_delete_permission的文档字符串 https://github.com/django/django/blob/1.9.7/django/contrib/admin/options.py#L448-L461:

def has_delete_permission(self, request, obj=None):
    """
    Returns True if the given request has permission to change the given
    Django model instance, ...
    """

这意味着has_delete_permission按请求执行,而不是按对象执行。在批量操作中,obj未设置。但是您可以检查request:

def has_delete_permission(self, request, obj=None):
    if request.POST and request.POST.get('action') == 'delete_selected':
        return '1' not in request.POST.getlist('_selected_action')
    return obj is None or obj.pk != 1

请注意,上述之所以有效,是因为the delete_selected action takes has_delete_permission考虑到 https://github.com/django/django/blob/1.9.7/django/contrib/admin/actions.py#L29.

您可能还需要提供有关该错误的一些详细信息:

from django.contrib import messages

def has_delete_permission(self, request, obj=None):
    if request.POST and request.POST.get('action') == 'delete_selected':
        if '1' in request.POST.getlist('_selected_action'):
            messages.add_message(request, messages.ERROR, (
                "Widget #1 is protected, please remove it from your selection "
                "and try again."
            ))
            return False
        return True
    return obj is None or obj.pk != 1

I guess has_delete_permission出于性能原因,按请求而不是按对象调用。一般情况下,做一个是没有用的SELECT查询并循环has_delete_permission(根据它的作用,这可能会很耗时)在运行之前DELETE询问。当需要这样做时,开发人员需要采取必要的步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 管理员:“删除”操作忽略了 has_delete_permission 的相关文章

  • Django 1.9:字段与父模型中不存在字段的字段冲突

    我有一些简单的模型 Profile Certifier 和 Designer 后者继承自 Profile 多表继承 在 Designer 中 有一个指向 Certifier 的外键 class Profile models Model TY
  • 在 Django 中定义视图和 url。为什么调用函数时不使用括号?

    我已经在经历 Python速成课程 目前正在进行 Django Web应用程序项目 学习日志 阶段 有些东西与我已经学到的相矛盾 views py file from django shortcuts import render def i
  • Django modelForm 中的文件上传

    我正在尝试在 appengine django 中上传文档 使用纯 django 代码成功上传文档 使用 python manage py runsever 但是当我尝试使用 appengine 项目运行 django 时 它给了我错误 E
  • 无法使用数据库路由器通过 save_model 进行保存

    我正在使用数据库路由器 因此我的应用程序有两个数据库 一个数据库用于默认 django 数据 另一个数据库用于存储默认 django 数据 在我的管理员中我已经覆盖了save model函数以保存created by变量 但我无法做到这一点
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • Django 模型表中是否可以对另一个表中的记录执行算术运算?

    如何填写一行或添加第二个表格 我需要对第一个表的最后一行执行计算并将结果发送到第二个表 这让人想起在两个 DataFrame 中处理数据 对另一个表模型最后一行的数据执行计算后 如何将值表添加到模型中 或者这只有在 DataFrame 功能
  • 如何在 Django 中获取文件的扩展名?

    我正在 Django 中构建一个网络应用程序 我有一个将文件发送到views py 的表单 Views login required login url login url def addCancion request if request
  • 在 python3.6 上 pip 安装 Django

    如果我跑pip install Django I get 已满足的要求 Django in usr local lib python2 7 dist packages 我想改用 python3 6 它已经安装在 usr bin python
  • 创建自定义用户注册表单 Django

    我正在尝试在 Django 中创建自定义用户注册表单 但收到以下错误 我页面上的所有内容都显示正确 但我收到错误 Error Exception Type KeyError Exception Value First name 我的表单 p
  • Django 模型同步表

    如果我更改 Django 模型中的字段 如何将其与数据库表同步 我是否需要在数据库上手动执行此操作 或者是否有工具可以帮助完成此过程 唉 Django 不支持任何简单的解决方案 django 唯一能为你做的就是使用与新模型匹配的新表重新启动
  • Django - 是否可以迭代方法?

    我正在 Django 中开发一个 Web 应用程序 它可以处理产品 价格和统计数据等 EDIT 更直接的解释 如何 分组 或 标记 一些实例方法 以便我可以像这样迭代它们for method in instance name of the
  • SMTPAuthenticationError: (535, b'5.7.8 用户名和密码在 Django 生产中不被接受?

    我在 Heroku 上部署了一个 Django 应用程序 在其中一节中 我使用 SMTP Gmail 设置向用户发送电子邮件 当我在本地运行项目时 电子邮件发送成功 但在 Heroku 上部署的项目上却发送失败 我在 Stackoverfl
  • 初始填充 Django Forms

    我决定学习 Django Forms 一段时间以来 我一直在使用 HTML 表单 因为我很难接受 Django Forms 如何将初始数据填充到 Django Forms 中 例子 考虑这些模型是否已填充 包含数据 模型 py class
  • 在 Django/python 中,如何将内存缓存设置为无限时间?

    cache set key value 9999999 但这并不是无限的时间 def get memcache timeout self timeout Memcached deals with long gt 30 days timeou
  • 使用 django 流式传输 mp3 文件,从带有

    我正在尝试制作一个小应用程序来通过 Web 界面传输我的 mp3 文件 并且我考虑过使用 django 在 python 中进行服务器端操作 我想要像 stream ID 这样的 url 来流式传输与该 ID 相对应的 mp3 我在 dja
  • Django 中同一个模型的多个多对多关系

    给定以下具有两个多对多关系的模型 class Child models Model name models CharField max length 80 class Foo models Model bar models ManyToMa
  • 使用 PyCharm 分析 Django

    即使在开发环境中 我的应用程序也相当慢 所以我想找出是什么导致它变慢 以便我可以尝试修复它 我了解调试工具栏 根据它的报告 数据库查询和下载的源都不是问题 所以它一定是业务逻辑 但是 我无法使用 Django 服务器运行 PyCharm 分
  • 如何按类的特定属性排序?

    我有一个具有跟踪价格属性的模型 现在 我有该型号的列表 无论如何 是否可以重新排列列表以按该特定属性进行排序 python 是否足够聪明 知道该属性是一个可以排序的值 我没有使用数据库跟踪特定模型的实例 我正在做的事情不需要它 所以我不能只
  • Django 权限

    我希望在我的 Django 项目中拥有更细粒度的权限 但无法决定使用哪个应用程序 我所拥有的是这样的 class Item models Model name models CharField max length 64 unique Tr
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序

随机推荐

  • 在实践中(而非理论上),小批量与实时流有什么区别?

    在实践中 而非理论上 小批量与实时流有什么区别 从理论上讲 我理解迷你批次是在给定时间范围内进行批处理的东西 而实时流更像是在数据到达时执行某些操作 但我最大的问题是为什么不使用带有 epsilon 时间范围 例如一毫秒 的迷你批次或者我想
  • 为什么 Firefox 即使输入不同的名称也会自动完成?

    或者 Firefox 如何确定密码 用户名的去向 如果我更改输入元素的名称 id 标题 类 Firefox 会继续用密码或电子邮件填充它 如果我正确理解 Firefox 的源代码 浏览器首先会在表单中查找密码字段 如果表单包含超过 3 个密
  • 使用 Dropout 时的验证损失

    我试图了解辍学对验证平均绝对误差 非线性回归问题 的影响 无辍学 辍学率为 0 05 With dropout of 0 075 在没有任何 dropout 的情况下 验证损失大于训练损失 如下所示1 https i stack imgur
  • 如何解压缩特定文件夹?

    如何使用 Ant 解压缩特定文件夹 具体来说 我下载了 apache tomcat 6 0 29 zip 其中包含文件夹 apache tomcat 6 0 29 我希望 Ant 解压 apache tomcat 6 0 29 下的所有内容
  • Gitlab CI部署AWS EC2

    我们有一个 lumen 应用程序 我们将项目移动到 GitLab 如果一切正常 我们想拉取该项目 我们添加两个脚本 gitlab ci yml variables All or variables stages test productio
  • airflow postgresql 后端:(psycopg2.OperationalError)致命:用户“airflow”的身份验证失败

    尝试在centos7机器上使用postgresql作为airflow v1 10 5 的后端 在本文之后 https www ryanmerlin com 2019 07 apache airflow installation on ubu
  • 带有 persistence.xml 的 Intellij JPA 控制台

    我正在使用 Intellij 13 设置无 xml 持久性 JPA Hibernate 4 Spring 3 当我尝试在 jpa 控制台中执行查询时 出现以下错误 javax persistence PersistenceException
  • 如何查找是否存在从顶点 x 到顶点 y 且包含边 e 的简单路径

    所以我面临这个问题 我希望有人可以帮助我 给定一个无向的图 G V E 2 个顶点 x y 和一条边 e v u 建议一种算法来查找是否存在简单的路径从 x 到 y 包括边 e 所以这里的重点是简单路径而不是常规路径 对于常规路径来说 使用
  • 在word中设置单个字母的样式

    我目前正在尝试设计 Siteripe 一词的样式 我希望每个字母都有不同的颜色 如本图所示page http www mobile siteripe com我可以使用下面的 CSS 代码行仅设置第一个字母的样式 namer first le
  • 防止 SQL Server 中的缓存

    使用Uncle Google浏览网络后 我找不到这个问题的答案 监视运行 IIS 和 MS SQL Server 2005 的生产服务器的性能和响应能力的最佳方法是什么 我目前正在使用 Pingdom 并希望它指向一个基本上模仿 现实世界查
  • Android Picasso 自动旋转图像

    我正在使用 Picasso 在我的应用程序中加载来自网络的图像 我注意到有些图像显示旋转了 90 度 尽管当我在浏览器中打开图像时 我看到它的位置正确 我假设这些图像有 EXIF 数据 有什么方法可以让Picasso忽略EXIF吗 众所周知
  • 自动从实体类@Size值复制inputText maxlength

    是否可以设置maxlength的属性
  • Web Api oData v4 $ref 404 或服务器错误

    Problem 我可以使用以下命令成功地从该关系的任一端获取相关项目 http localhost api 练习 1 http localhost api Exercises 1 expand 测量值 http localhost 4954
  • Git 命令自动子树合并项目与子模块?

    I found 使用 Git 子树合并具有子模块的外部项目的最佳方法是什么 https stackoverflow com questions 645019 using git whats the best way to subtree m
  • TeamCity 工件路径组合文件夹

    我需要创建包含两个文件夹的 zip 存档工件 我知道如何创建一个文件夹存档 Folder1 gt myartifact zip 但是我如何告诉 TeamCity 将Folder2 添加到同一个存档中 相同的 target archive 名
  • Google Colab 中的编号标题和目录

    有没有办法在 Google Colab 中启用编号标题和目录 类似问题 markdown jupyter笔记本中的编号标题 VoidCC https stackoverflow com questions 49189154 numbered
  • 如何在 phpMyAdmin (MySQL) 中编写 SP?

    如何在 phpMyAdmin 中编写存储过程 在 phpMyAdmin 中 您可以在 SQL 窗口中创建存储过程 您可能必须将分隔符设置为 之类的内容 而不是默认的 您可以从 SQL 窗口底部更改此设置
  • java同步与异常处理

    如果我有一个同步块 并且该块内的某处抛出了一个未在同步块内捕获的异常 那么当异常传播出同步块时 锁会被放弃吗 同步块 synchronized mutex throw new Exception 锁总是被释放 来自JLS 14 19 htt
  • 如何检查对象值是否在manytomany字段中?

    如何检查值是否在manytomany字段中 我正在尝试做这样的事情 if value in object1 followers BLA BLA BLA But ManyRelatedManager is not iterable 那么正确的
  • Django 管理员:“删除”操作忽略了 has_delete_permission

    假设我有一个模型 其中 ID 为 1 的行很特殊 不应该被删除 但所有其他行都可以删除 这是我实现该逻辑的尝试 模型 py from django db import models class Widget models Model nam