你可以给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_config
variables设置为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_config
variables设置为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
为一个帮助程序文件。