这是在Django Admin中描述模块的经典方法,而且效果很好!
在bookshelf / 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/的包),什么是覆盖此部分及其内部项目的默认名称的正确方法?
答案 0 :(得分:0)
作为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部分。
答案 1 :(得分:0)
假设您有一个这样的模型:
class Stuff(models.Model):
class Meta:
verbose_name = u'The stuff'
verbose_name_plural = u'The bunch of stuff'
您有verbose_name,但是您也想自定义app_label以便在admin中进行不同的显示。不幸的是,有一些任意字符串(带空格)是行不通的,而且无论如何也不能显示。
证明管理员使用app_label。 title()进行显示,因此我们可以进行一些改动:具有重写的title方法的str子类:
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/