简化django管理的函数属性的使用,使mypy高兴
django-admin-displa的Python项目详细描述
django管理显示
简化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以来已弃用)
禁用自动转义。
下面的示例显示了通常如何将这些属性应用于AdminModel
或Model
方法。
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。