当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你可以给一个Django应用程序一个详细的名称,以便在整个管理员中使用吗?》经验,为你挑选了8个好方法。

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



1> Frost.baka..:

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'


注意,这与详细名称不同,在某种意义上它只影响向用户显示的内容.它是用于命名数据​​库中表的文字字符串,如果您要更改现有模型,则需要进行模式迁移.
我在管理员中遇到了这个问题.这取决于app_label,当我开始更改名称时,它打破了那些东西.
我不认为这是一个很好的解决方案.它有太多其他不美观的副作用.

2> r---------k..:

正如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> man2xxl..:

如果您在应用程序中有多个模型,只需使用元信息创建模型,并为所有模型创建该类的子类.

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

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



4> Andy Baker..:

给他们一个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

在调整索引视图时,为什么不添加"订单"属性.



5> darren..:

好吧,我启动了一个名为todo的应用程序,现在我决定将它命名为Tasks.问题是我已经在我的表中有数据所以我的工作如下.放入models.py:

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

希望能帮助到你.



6> spookylukey..:

对于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视图.它不会修复所有其他管理视图中的面包屑.



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 -*-



8> temoto..:

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

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有