如何在父类Mixin中动态设置子类字段的help_text为子类类名?
解决方案:在Django Mixin的字段help_text中显示子类类名
你当前的写法会直接报错,因为定义models.CharField时,self还不存在(此时Mixin类还未被实例化或被子类继承)。以下是几种可行的实现方式:
方法1:使用__init_subclass__动态修改(推荐)
利用Python的__init_subclass__特性,在子类继承Mixin时自动修改title字段的help_text,直接获取子类类名:
from django.db import models from django.utils.translation import gettext_lazy as _ class TitleSlugMixin(models.Model): title = models.CharField( _('title'), max_length=255, help_text=_('title.') # 先设置基础占位值 ) def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 动态替换为子类的类名 cls.title.field.help_text = _(f'{cls.__name__} title.') class Brand(TitleSlugMixin): # 子类自定义字段 description = models.TextField(_('description'))
如果想显示更友好的名称(比如模型的verbose_name),可以把代码改成:
cls.title.field.help_text = _(f'{cls._meta.verbose_name} title.')
方法2:用lazy延迟计算help_text
借助Django的lazy函数,延迟到实际需要使用help_text时再获取子类类名:
from django.db import models from django.utils.functional import lazy from django.utils.translation import gettext_lazy as _ def get_title_help_text(model_cls): return _(f'{model_cls.__name__} title.') class TitleSlugMixin(models.Model): title = models.CharField( _('title'), max_length=255, help_text=lazy(lambda self: get_title_help_text(self.__class__), str)() ) class Brand(TitleSlugMixin): description = models.TextField(_('description'))
这种方式会在访问help_text时(比如在Admin界面渲染表单时)才计算子类名称,适合需要动态实例化的场景。
方法3:子类直接重写(不推荐,失去复用性)
如果子类数量少,也可以直接在子类中重写title字段的help_text,但这种方式违背了Mixin的复用初衷:
class Brand(TitleSlugMixin): title = models.CharField( _('title'), max_length=255, help_text=_('Brand title.') ) description = models.TextField(_('description'))
内容的提问来源于stack exchange,提问作者DjangoLover
相关产品推荐
相关产品推荐

