为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖 Django 管理中任何外部包的默认文本标签

覆盖 Django 管理中任何外部包的默认文本标签

慕田峪4524236 2021-11-23 16:50:07
这是在 Django Admin 中描述模块的经典方式,而且效果很好!在书架/apps.pyfrom django.apps import AppConfigclass BOOKConfig(AppConfig):    name = 'bookshelf'    verbose_name = "Your Book"在bookshelf/__init__.py:default_app_config = 'bookshelf.apps.BOOKConfig'但是,当您想覆盖外部模块的标题(例如来自https://djangopackages.org/ 的包)时,覆盖此部分及其内部项目的默认名称的正确方法是什么?
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

假设你有一个这样的模型:


class Stuff(models.Model):

    class Meta:

        verbose_name = u'The stuff'

        verbose_name_plural = u'The bunch of stuff'

您有verbose_name,但是您也想为admin 中的不同显示自定义app_label。不幸的是,有一些任意字符串(带空格)不起作用,无论如何它都不用于显示。


原来管理员使用 app_label。title () 用于显示,所以我们可以做一个小技巧:str 子类,带有覆盖的 title 方法:


class string_with_title(str):

    def __new__(cls, value, title):

        instance = str.__new__(cls, value)

        instance._title = title

        return instance


    def title(self):

        return self._title


    __copy__ = lambda self: self

    __deepcopy__ = lambda self, memodict: self

现在我们可以有这样的模型:


class Stuff(models.Model):

    class Meta:

        app_label = string_with_title("stuffapp", "The stuff box")

        # 'stuffapp' is the name of the django app

        verbose_name = 'The stuff'

        verbose_name_plural = 'The bunch of stuff'

原 Ionel 的帖子https://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/


查看完整回答
反对 回复 2021-11-23
?
湖上湖

TA贡献2003条经验 获得超2个赞

正如文档所说,新应用程序应避免使用 default_app_config。


而不是添加default_app_config到应用程序的__init__.py,只需使用INSTALLED_APPS.


INSTALLED_APPS = [

    ...

    'bookshelf.apps.BOOKConfig'

    ...

]

对于第三方应用程序,您可以执行相同的操作。apps.py在您的项目中的某处创建一个(例如旁边myproject/settings.py),并创建一个应用程序配置。


from third_party_app..apps import ThirdPartyConfig


class MyThirdPartyConfig(ThirdPartyConfig):

    verbose_name = "Customized app name"

如果应用程序没有 App Config 类,则创建子类AppConfig并确保将name.


from django.apps import AppConfig

class MyThirdPartyConfig(AppConfig):

    name = 'third_party_app'

    verbose_name = "Customized app name"

然后使用您的应用程序配置类的路径,INSTALLED_APPS而不是应用程序名称/默认应用程序配置。


INSTALLED_APPS = [

    ...

    'myproject.apps.MyThirdPartyConfig,

    ...

]

有关另一个示例,请参阅文档的应用程序用户部分。


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信