简化django管理的函数属性的使用,使mypy高兴

django-admin-displa的Python项目详细描述


django管理显示

VersionBuild statusCoveragePython VersionsLicense

简化django管理员的函数属性(例如short_description)的使用,并使mypy高兴:)

要求

  • python=3.6
  • django>;=1.11

用法

如果要更改django在管理界面中显示只读值的方式, 您可以在相应的方法中添加一些special attributes。 支持的值是

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

empty_value_display
如果字段的值是None、空字符串或不带元素的iterable,则改为显示此值。

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

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

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

下面的示例显示了通常如何将这些属性应用于AdminModelModel方法。

class Company(models.Model):
    ...

    def owner(self) -> bool:
        return self.owner.last_name
    is_valid.short_description = "Company owner"
    is_valid.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_diplay装饰器获得相同的结果。

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]" has no attribute "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上已经知道并进行了大量讨论。

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

开发

此项目正在使用poetry管理所有 开发依赖项。 克隆此存储库并运行

  poetry install
  poetry run pip install Django

创建具有所有依赖项的虚拟环境。 现在您可以使用

  poetry run pytest

这个存储库遵循angular commit conventions

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
文件名的java正则表达式限制名称大小和文件扩展名   Mac上的java Android SDK:jspawnhelper意外退出   java SQL Server 2000到Oracle 12c重音字符   在Java中快速比较大数据集中的值和小数据集中的值   java在代码中的许多地方保留对对象的引用   Java规范中私有内部类的jvm访问标志与反射API不一致?   比较2个int数组中匹配的数字   java Apache Commons数学简化回归:get prediction stderr   安卓 Java SDK管理器因命令行输出中的“flashplayerplugin”而崩溃   JavaSQLite:关闭DB时必须关闭游标吗?   泛型Java设计抽象类声明示例说明   java应用程序在添加片段时崩溃   如何在java中使用注释为字段加载值