您可以给Django应用指定一个冗长的名称以供整个管理员使用吗?


140

您可以使用为字段和模型提供Django管理员中显示的详细名称的相同方式,可以为应用程序自定义名称吗?


4
该票证将解决此问题:code.djangoproject.com/ticket/3591。不幸的是,它似乎并不会很快集成到Django中……
Benjamin Wohlwend,2009年

10
由于Django的1.7,这是现在可以开箱-见docs.djangoproject.com/en/1.7/ref/applications/...
rhunwicks

Answers:


182

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'

12
我在管理员中遇到了麻烦。很大程度上取决于app_label,当我开始更改名称时,它破坏了这些东西。
乔J

我知道,我最终写了一个带有app_url:app_name绑定的字典的templatag。
Frost.baka 2011年

58
请注意,这与详细名称不同,因为它仅影响显示给用户的内容。这是用于在数据库中命名表的文字字符串,如果要更改现有模型,则需要进行模式迁移。
塞林2012年

6
我认为这不是一个好的解决方案。它还有许多其他非美学的副作用。
大卫·桑德斯

这个流行的答案建议使用Django 1.7之前需要的hack /解决方法。如果您使用的是1.7或更高版本,请按照iMaGiNiX的建议使用apps.py文件。
hacker'2

38

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

它炒菜很好,但在代码初始化,如果你安装的应用程序中INTALLED_APPS一个Django recomendation例如.py文件不是必须的:“App_name.apps.AppnameConfig”
Roberth索利斯

31

如果应用程序中有多个模型,则只需使用元信息创建一个模型,然后为所有模型创建该类的子类。

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

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

12

给他们一个verbose_name属性。

不要抱有希望。您还需要将索引视图从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

在调整索引视图时,为什么也不要添加“ order”属性。


12

好吧,我启动了一个名为todo的应用程序,现在决定将其命名为Tasks。问题是我的表中已经有数据,因此我的解决方法如下。放入models.py:

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

希望能帮助到你。


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)

这样可以修复索引和app_index视图。它并不能解决所有其他管理员视图中的面包屑。


7

首先,您需要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 -*-

只是一些简单的注释:创建名为的文件apps.py不是强制性的。任何名称都可以(但您必须在中引用它__init__.py)。如其他注释中所述,此代码适用于django> = 1.7(docs.djangoproject.com/en/1.7/ref/applications/…)。
弗林斯

它炒菜很好,但在代码初始化,如果你安装的应用程序中INTALLED_APPS一个Django recomendation例如.py文件不是必须的:“App_name.apps.AppnameConfig”
Roberth索利斯

6

否,但是您可以复制管理模板并在其中定义应用程序名称。


3

可以完成不需要任何迁移的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以便在admin中进行不同的显示。不幸的是,有一些任意字符串(带空格)是行不通的,而且无论如何也不能显示。

原来,管理员使用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'

管理员将显示“填充框”作为应用名称。

“”


2

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


1

好吧,这对我有用。在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',

]


0

自以来,以下即插即用的代码完美地发挥了作用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功能分解为帮助文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.