你可以给Django应用程序一个详细的名称在整个pipe理员使用?

以同样的方式,你可以给出出现在Djangopipe理员的字段和模型的详细名称,你可以给应用程序一个自定义名称?

在Django之前1.7

您可以通过在模型定义中定义app_label来给应用程序定制一个名称。 但是,由于Django构buildpipe理页面,它将通过app_label对模型进行散列,所以如果你希望它们出现在一个应用程序中,你必须在应用程序的所有模型中定义这个名称。

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

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_configvariables设置为YourAppConfig

 # in yourapp/__init__.py default_app_config = 'yourapp.apps.YourAppConfig' 

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

 class MyAppModel(models.Model): class Meta: app_label = 'My App Label' abstract = True class Category(MyAppModel): name = models.CharField(max_length=50) 

正如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_configvariables设置为YourAppConfig

 # in yourapp/__init__.py default_app_config = 'yourapp.apps.YourAppConfig' 

给他们一个verbose_name属性。

不要让你的希望。 您还需要将django.contrib.admin.sites中的索引视图复制到您自己的ProjectAdminSite视图中,并将其包含在您自己的自定义pipe理实例中:

 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 

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

那么我开始了一个名为待办事项的应用程序,现在已经决定要把它命名为任务 。 问题是我已经有了我的表中的数据,所以我的工作如下。 放入models.py:

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

希望它有帮助。

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

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

首先,您需要在您的应用apps.py文件夹中创build一个像这样的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上testing

我的自定义应用名称

对于西class牙人有问题的人

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

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

我正在使用django-admin-tools 。

有一个黑客可以做,不需要任何迁移。 从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。 不幸的是有一些任意的string(与空格)不起作用,它不是用于显示。

原来,pipe理员使用app_label。 title()显示,所以我们可以做一个小黑客: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' 

pipe理员将显示“The stuff box”作为应用程序名称。

“””

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

自从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函数get_current_app_name为一个帮助程序文件。