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

时间:2009-03-04 20:51:04

标签: python django

就像你可以给出Django管理员中显示的字段和模型详细名称一样,你能给一个应用程序一个自定义名称吗?

13 个答案:

答案 0 :(得分:166)

Django 1.8 +

根据1.8 docs(以及current docs),

  

新应用程序应该避免使用default_app_config。相反,他们应该要求在AppConfig中明确配置相应INSTALLED_APPS子类的虚线路径。

示例:

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

然后更改下面列出的AppConfig

Django 1.7

正如rhunwicks对OP的评论所述,自Django 1.7以来,现在可以开箱即用

取自docs

# 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'

答案 1 :(得分:37)

正如rhunwicks'所述。对OP的评论,现在可以开箱即用,因为Django 1.7

取自docs

# 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'

答案 2 :(得分:31)

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

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

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

答案 3 :(得分: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

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

答案 4 :(得分:12)

我启动了一款名为 todo 的应用,现在我决定将其命名为任务。问题是我已经在我的表中有数据所以我的工作如下。放入models.py:

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

希望它有所帮助。

答案 5 :(得分:7)

对于Django 1.4(尚未发布,但trunk非常稳定),您可以使用以下方法。它依赖于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视图。它不会在所有其他管理员视图中修复面包屑。

答案 6 :(得分:7)

首先,您需要在appfolder上创建这样的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 -*-

答案 7 :(得分:6)

不,但您可以复制管理员模板并在那里定义应用名称。

答案 8 :(得分:3)

我正在使用django-admin-tools

答案 9 :(得分:3)

可以完成不需要任何迁移的黑客攻击。 取自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,但是您也想为admin中的不同显示自定义app_label。不幸的是,有一些任意的字符串(带空格)不起作用,无论如何都不能显示。

原来管理员使用app_label。 title()用于显示所以我们可以制作一个小的hack: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 :(得分: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)

请注意,网址将为/ admin / NewAPPname / mynewmodel /,因此您可能只想确保新模型的类名尽可能接近旧模型。

答案 11 :(得分: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',

]

答案 12 :(得分: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功能分解为帮助文件。