您能给 Django 应用程序一个详细名称以供整个管理员使用吗?

2025-04-16 08:56:00
admin
原创
17
摘要:问题描述:就像您可以为 Django 管理员中显示的字段和模型赋予详细名称一样,您可以为应用程序赋予自定义名称吗?解决方案 1:Django 1.8+根据1.8 文档(和当前文档),新的应用程序应该避免使用。相反,它们应该要求在 中明确配置default_app_config相应子类的虚线路径。AppConf...

问题描述:

就像您可以为 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 官方文档页面了解更多信息。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用