你能给一个 Django 应用程序一个详细的名称,以便在整个管理过程中使用吗?

就像你可以给出出现在 Django 管理中的字段和模型详细的名称一样,你可以给一个应用程序一个定制的名称吗?

85886 次浏览

不,但你可以复制管理模板和定义应用程序的名称。

给它们一个 verose _ name 属性。

别抱太大希望。您还需要将 django.Contrib.admin.site 的索引视图复制到您自己的 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

在调整索引视图的同时,为什么不添加一个“ order”属性呢。

Django 1.8 +

根据 1.8个医生(和 现有文件) ,

新的应用程序应该避免 default_app_config。相反,它们应该要求在 INSTALLED_APPS中显式配置到适当的 AppConfig子类的虚线路径。

例如:

INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]

然后改变你的 AppConfig,如下所列。

姜戈1.7

正如 rhunwick 在 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'

在姜戈之前是1.7

通过在模型定义中定义 app _ label,可以为应用程序提供一个自定义名称。但是当 django 构建管理页面时,它将根据 app _ label 对模型进行散列,因此如果希望它们出现在一个应用程序中,就必须在应用程序的所有模型中定义这个名称。

class MyModel(models.Model):
pass
class Meta:
app_label = 'My APP name'

我开始了一个叫做 一切就绪的应用程序,现在我决定把它命名为 任务。问题是我的表中已经有了数据,因此我的工作如下所示。放置到 models.py:

    class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'

希望能有帮助。

如果你在应用程序中有多个模型,只需创建一个包含 Meta 信息的模型,并为所有模型创建该类的子类。

class MyAppModel(models.Model):
class Meta:
app_label = 'My App Label'
abstract = True


class Category(MyAppModel):
name = models.CharField(max_length=50)

对于 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)

这会修复索引和 app _ index 视图,但不会修复所有其他管理视图中的面包屑。

如果您已经有使用旧应用程序名称的现有表,并且不想迁移它们,那么只需在原始模型的代理上设置 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/,因此您可能只想确保新模型的类名看起来尽可能接近旧模型。

有一种不需要任何迁移就可以完成的黑客技术。 摘自 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'

您已经有了 verose _ name,但是您也希望自定义 app _ label,以便在管理中显示不同的内容。不幸的是,有一些任意的字符串(带有空格)是不起作用的,而且它也不是用来显示的。

原来管理员使用 app _ label。Title ()用于 display,这样我们就可以做一个小小的修改: 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'

管理员将显示“的东西箱”作为应用程序的名称。

"""

首先,你需要在你的应用程序文件夹中创建一个像这样的 apps.py文件:

# 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

My custom App Name

对于一个和西班牙人有矛盾的人来说

这段代码在 python2脚本上启用了 utf-8兼容性

# -*- coding: utf-8 -*-

正如 rhunwick 在 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以来工作得非常完美。你所要做的就是将下面的代码复制到特定应用程序的 __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函数分解为一个 helper 文件。

这个对我很有用,在 app.py 中使用这个:

class MainConfig(AppConfig):
name = 'main'
verbose_name="Fancy Title"

在 seting.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',

]

这很简单,只需按照以下步骤在 appName/apps 上添加即可

class AppNameConfig(AppConfig):
default_auto_field = 'default Django'
name = 'AppName'
verbose_name = 'Name you Want'

2021年最新情况(Django 3.2) :

Py 文件中找到 AppClientsConfig 类里面。您可以在其中找到 name 属性。不要改变它,除非你真的不得不这样做(然后你还需要改变 setings.py 文件中的应用注册表... 等等).

取而代之的是 像这样向类中添加一个属性:

verbose_name = "The Name You Like"

这样应该可以了。你可以在 Django 官方文档页面上阅读更多相关内容。