0

这是在 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/的包)时,覆盖此部分的默认名称和其中的项目的正确方法是什么?

4

2 回答 2

0

假设您有这样的模型:

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 子类,重写 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/

于 2019-03-07T13:41:59.537 回答
0

正如文档所说,新应用程序应避免使用 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,
    ...
]

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

于 2019-03-01T15:58:29.623 回答