utils.models.choice 源代码

from typing import Any, Callable, TypeVar, Annotated
from typing_extensions import Never


__all__ = [
    'Annotated',  # 字段应以Annotated标注选项,从typing显式导入,或从本模块全部导入
    'choice',
    'CustomizedDisplay',
    'DefaultDisplay',
]


T = TypeVar('T')

[文档] def choice(value: T, display: Any = None) -> T: ''' 解决Django Choices拆分实际常量值和展示内容的问题,避免类型检查器判断错误。 用法:: class MyChoices(IntegerChoices): CHOICE1 = choice(0, '第一种选择的说明') CHOICE2 = choice(1) 尽管允许使用``choice(value)``,仍应手动提供展示内容。 ''' if display is None: return value return value, display # type: ignore
CustomizedDisplay = Annotated[Callable[[], str], choice('value', 'with display')] CustomizedDisplay.__doc__ = ''' 由定制好呈现内容的选择字段生成的展示函数,会被用于在admin页面展示。 ''' DefaultDisplay = Annotated[Callable[[], str], choice('value')] DefaultDisplay.__doc__ = ''' 由默认的展示内容生成的展示函数,会被用于在admin页面展示。 默认的展示内容是常量名的标题形式,如`APPOINTED`会被展示为`Appointed`。 暴露给用户可能存在常量名攻击的风险,因此不建议使用。 ''' DeletedDisplay = Callable[[Never], str]