跳转到主要内容

简化了django admin中函数属性的使用,并使mypy满意

项目描述

django-admin-display

PyPI GitHub Workflow Status (master) Coveralls github branch PyPI - Python Version PyPI - License

简化了django admin中函数属性(例如short_description)的使用,并使mypy满意 :)

要求

  • Python 3.6.1或更高版本
  • Django >= 1.11

用法

如果您想更改Django在管理界面中显示只读值的行为,可以向相应的方法添加一些特殊属性。支持以下值

short_description
自定义可调用对象的列标题。

empty_value_display
如果字段的值为None、空字符串或无元素的迭代器,则显示此值。

admin_order_field
指示该值由某个数据库字段表示。

boolean
如果方法返回布尔值,则显示一个漂亮的“开”或“关”图标。

allow_tags(自Django 1.9以来已弃用)
禁用自动转义。

以下示例展示了您通常如何将这些属性应用于 AdminModelModel 方法。

class Company(models.Model):
    ...

    def owner(self) -> bool:
        return self.owner.last_name
    owner.short_description = "Company owner"
    owner.admin_order_field = 'owner__last_name'

本模块通过提供方便的装饰器来替换定义这些属性的方式。

from django_admin_display import admin_display


class Company(models.Model):
    ...

    @admin_display(
        short_description="Company owner",
        admin_order_field='owner__last_name',
    )
    def owner(self) -> bool:
        return self.owner.last_name

为什么?

这个模块存在主要有两个原因。

使用 @property

在管理界面中显示计算模型属性是很常见的情况

class Company(models.Model):
    ...

    @property
    def created_on(self) -> datetime.date:
        return self.created_at.date()

为了添加特殊属性,您必须创建一个受保护的方法,附加属性并使用 property() 包装该方法

class Company(models.Model):
    ...

    def _created_on(self) -> datetime.date:
        return self.created_at.date()
    _created_on.short_description = "Created on"
    created_on = property(_created_on)

这相当麻烦,难以阅读,而且大多数人不知道这是可能的。为了克服这些缺点,您可以使用 @admin_display 装饰器达到相同的结果

from django_admin_display import admin_display


class Company(models.Model):
    ...

    @property
    @admin_display(
        short_description = "Created on",
    )
    def created_on(self) -> datetime.date:
        return self.created_at.date()

mypy

如果您使用 mypy,您可能遇到了类似以下错误

"Callable[[Any, Any], Any]" 没有属性 "short_description"

常见的解决方案是在行尾添加 # type: ignore 来忽略类型检查

class CompanyAdmin(admin.ModelAdmin):
    ...

    def created_on(self, company: models.Company) -> datetime.date:
        return company.created_at.date()
    created_on.short_description = "Created on"  # type: ignore

该问题已在 github 上被知晓并广泛讨论。

这个装饰器通过内部使用 # type: ignore 并提供对设置属性的良好定义的签名来解决此问题。这不是一个最优的解决方案,但在问题得到解决之前可以很好地工作。

开发

本项目使用 poetry 进行打包和管理所有依赖项,并使用 pre-commit 运行 flake8isortmypyblack

克隆此仓库并运行

poetry install
poetry run pre-commit install

以创建包含所有依赖项的虚拟环境。之后,您可以使用以下命令运行测试套件

poetry run pytest

此仓库遵循 Conventional Commits 风格。

Cookiecutter 模板

本项目使用 cruftcookiecutter-pyproject 模板创建。要更新此仓库到最新模板版本,请在仓库根目录中运行

cruft update

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分发

django-admin-display-1.3.0.tar.gz (5.4 kB 查看哈希值)

上传时间

构建分发

django_admin_display-1.3.0-py3-none-any.whl (5.0 kB 查看哈希值)

上传时间 Python 3

由以下支持