您能给 Django 应用程序一个详细名称以供整个管理员使用吗?
- 2025-04-16 08:56:00
- admin 原创
- 16
问题描述:
就像您可以为 Django 管理员中显示的字段和模型赋予详细名称一样,您可以为应用程序赋予自定义名称吗?
解决方案 1:
Django 1.8+
根据1.8 文档(和当前文档),
新的应用程序应该避免使用。相反,它们应该要求在 中明确配置
default_app_config
相应子类的虚线路径。AppConfig
`INSTALLED_APPS`
例子:
INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]
然后AppConfig
按如下所示进行更改。
Django 1.7
正如 rhunwicks 对 OP 的评论所述,从 Django 1.7 开始,这已经成为可能
摘自文档:
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
verbose_name = 'Fancy Title'
然后将default_app_config
变量设置为YourAppConfig
# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'
Django 1.7 之前
您可以通过在模型定义中定义 app_label 来为您的应用指定自定义名称。但是,Django 在构建管理页面时会根据模型的 app_label 对它们进行哈希处理,因此,如果您希望它们出现在同一个应用中,则必须在应用的所有模型中都定义此名称。
class MyModel(models.Model):
pass
class Meta:
app_label = 'My APP name'
解决方案 2:
正如 rhunwicks 对 OP 的评论所述,从 Django 1.7 开始,这已经成为可能
摘自文档:
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
verbose_name = 'Fancy Title'
然后将default_app_config
变量设置为YourAppConfig
# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'
解决方案 3:
如果应用程序中有多个模型,只需创建一个包含元信息的模型,并为所有模型创建该类的子类。
class MyAppModel(models.Model):
class Meta:
app_label = 'My App Label'
abstract = True
class Category(MyAppModel):
name = models.CharField(max_length=50)
解决方案 4:
我启动了一个名为todo的应用,现在决定将其命名为Tasks。问题是我的表中已经有数据了,所以我的解决方法如下。将其放入 models.py 中:
class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'
希望有帮助。
解决方案 5:
给他们一个 verbose_name 属性。
别抱太大希望。你还需要将 index 视图从 django.contrib.admin.sites 复制到你自己的 ProjectAdminSite 视图中,并将其添加到你自己的自定义管理实例中:
class ProjectAdminSite(AdminSite):
def index(self, request, extra_context=None):
copied stuff here...
admin.site = ProjectAdminSite()
然后调整复制的视图,以便它使用 verbose_name 属性作为应用程序的标签。
我通过向复制的视图添加一些类似这样的内容来实现这一点:
try:
app_name = model_admin.verbose_name
except AttributeError:
app_name = app_label
当您调整索引视图时,为什么不添加“顺序”属性呢?
解决方案 6:
首先,您需要apps.py
在 appfolder 上创建一个如下文件:
# appName/apps.py
# -*- coding: utf-8 -*-
from django.apps import AppConfig
class AppNameConfig(AppConfig):
name = 'appName'
verbose_name = "app Custom Name"
默认加载此 AppConfig 子类:
# appName/__init__.py
default_app_config = 'appName.apps.AppNameConfig'
是最好的办法。在 Django 1.7 上测试
对于西班牙语有问题的人来说
此代码启用 python2 脚本的 utf-8 兼容性
# -*- coding: utf-8 -*-
解决方案 7:
对于 Django 1.4(尚未发布,但主干版本已相当稳定),您可以使用以下方法。该方法依赖于 AdminSite 现在返回 TemplateResponse 的事实,您可以在渲染之前对其进行修改。
在这里,我们做了一点猴子修补来插入我们的行为,如果使用自定义 AdminSite 子类,则可以避免这种情况。
from functools import wraps
def rename_app_list(func):
m = {'Sites': 'Web sites',
'Your_app_label': 'Nicer app label',
}
@wraps(func)
def _wrapper(*args, **kwargs):
response = func(*args, **kwargs)
app_list = response.context_data.get('app_list')
if app_list is not None:
for a in app_list:
name = a['name']
a['name'] = m.get(name, name)
title = response.context_data.get('title')
if title is not None:
app_label = title.split(' ')[0]
if app_label in m:
response.context_data['title'] = "%s administration" % m[app_label]
return response
return _wrapper
admin.site.__class__.index = rename_app_list(admin.site.__class__.index)
admin.site.__class__.app_index = rename_app_list(admin.site.__class__.app_index)
这将修复 index 和 app_index 视图。它不会修复所有其他管理视图中的面包屑导航。
解决方案 8:
不,但是您可以复制管理模板并在那里定义应用程序名称。
解决方案 9:
有一个 hack 可以做到,而且不需要任何迁移。摘自 Ionel 的博客,版权归他所有:http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
还有一张针对此问题的票,应该在 Django 1.7 中修复 https://code.djangoproject.com/ticket/3591
“””
假设你有一个这样的模型:
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 () 进行显示,因此我们可以进行一些小修改:使用覆盖的 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'
管理员将显示“The stuff box”作为应用程序名称。
“””
解决方案 10:
如果您已经有使用旧应用程序名称的现有表,并且您不想迁移它们,那么只需在原始模型的代理上设置 app_label 即可。
class MyOldModel(models.Model):
pass
class MyNewModel(MyOldModel):
class Meta:
proxy = True
app_label = 'New APP name'
verbose_name = MyOldModel._meta.verbose_name
然后你只需要在你的 admin.py 中更改它:
#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)
请注意,url 将是 /admin/NewAPPname/mynewmodel/,因此您可能只想确保新模型的类名尽可能接近旧模型。
解决方案 11:
嗯,这对我来说很管用。在 app.py 中使用以下命令:
class MainConfig(AppConfig):
name = 'main'
verbose_name="Fancy Title"
在 setting.py 中添加 App 的名称以及 App 文件夹中 app.py 文件中的类名
INSTALLED_APPS = [
'main.apps.MainConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
解决方案 12:
这很简单,只需在您的 appName/apps 上添加以下内容
class AppNameConfig(AppConfig):
default_auto_field = 'default Django'
name = 'AppName'
verbose_name = 'Name you Want'
解决方案 13:
以下即插即用的代码片段运行良好,因为Django 1.7
。您只需将以下代码复制到__init__.py
特定应用程序的文件中并更改VERBOSE_APP_NAME
参数即可。
from os import path
from django.apps import AppConfig
VERBOSE_APP_NAME = "YOUR VERBOSE APP NAME HERE"
def get_current_app_name(file):
return path.dirname(file).replace('\\', '/').split('/')[-1]
class AppVerboseNameConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__) + '.__init__.AppVerboseNameConfig'
如果您将其用于多个应用程序,则应将该功能分解get_current_app_name
为辅助文件。
解决方案 14:
2021 年更新(Django 3.2):
在你的应用程序的 app.py 文件中,你可以找到 AppClientsConfig 类。其中有 name 属性。除非你真的需要,否则不要更改它(否则你还需要更改 settings.py 文件中的应用程序注册表……等等)。
而是向类添加一个属性,如下所示:
verbose_name = "The Name You Like"
这应该可以解决问题。欢迎访问Django 官方文档页面了解更多信息。
扫码咨询,免费领取项目管理大礼包!