【问题标题】:Override default text label for any external packages in Django admin覆盖 Django admin 中任何外部包的默认文本标签
【发布时间】:2019-07-23 16:26:48
【问题描述】:

这是在 Django Admin 中描述模块的经典方式,效果很好!

在书架/apps.py

from django.apps import AppConfig
class BOOKConfig(AppConfig):
    name = 'bookshelf'
    verbose_name = "Your Book"

bookshelf/__init__.py:

default_app_config = 'bookshelf.apps.BOOKConfig'

但是当您想要覆盖外部模块的标题时(例如,来自 https://djangopackages.org/ 的包),覆盖此部分的默认名称和其中的项目的正确方法是什么?

【问题讨论】:

    标签: python django django-admin django-apps django-modeladmin


    【解决方案1】:

    作为docs say,新应用应该避免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,
        ...
    ]
    

    有关另一个示例,请参阅文档的 for application users 部分。

    【讨论】:

    • 效果很好!极好的!非常感谢 Alasdair。 在下面的列表中,我们需要删除原始应用程序名称以损害新配置的另一件事(如果有人也会尝试的话),甚至可能添加变量名称像 Alasdair 说的新配置:D Greattttttt。 INSTALLED_APPS = [ ... 'bookshelf.apps.BOOKConfig' ... ]
    【解决方案2】:

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

    class Stuff(models.Model):
        class Meta:
            verbose_name = u'The stuff'
            verbose_name_plural = u'The bunch of stuff'
    

    您有verbose_name,但是您也想自定义app_label 以在管理员中进行不同的显示。不幸的是,有一些任意字符串(带空格)是行不通的,而且它也不是用来显示的。

    原来管理员使用 app_label。 title() 用于显示,所以我们可以做一个小技巧:str subclass with overriden title method:

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 2013-04-28
      • 2021-05-06
      • 2012-03-09
      • 2018-06-21
      相关资源
      最近更新 更多