就像你可以给出Django管理员中出现的字段和模型详细名称一样,你能给一个应用程序一个自定义名称吗?
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'
正如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'
如果您在应用程序中有多个模型,只需使用元信息创建模型,并为所有模型创建该类的子类.
class MyAppModel(models.Model): class Meta: app_label = 'My App Label' abstract = True class Category(MyAppModel): name = models.CharField(max_length=50)
给他们一个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
在调整索引视图时,为什么不添加"订单"属性.
好吧,我启动了一个名为todo的应用程序,现在我决定将它命名为Tasks.问题是我已经在我的表中有数据所以我的工作如下.放入models.py:
class Meta: app_label = 'Tasks' db_table = 'mytodo_todo'
希望能帮助到你.
对于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视图.它不会修复所有其他管理视图中的面包屑.
首先,您需要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 -*-
不,但您可以复制管理员模板并在那里定义应用名称.