Можете ли вы дать приложению Django подробное имя для использования в админке?
143
Точно так же, как вы можете давать полям и моделям подробные имена, которые появляются в администраторе Django, можете ли вы дать приложению собственное имя?
Новых приложений следует избегать default_app_config. Вместо этого они должны потребовать, чтобы пунктирный путь к соответствующему AppConfigподклассу был явно настроен в INSTALLED_APPS.
# in yourapp/apps.pyfrom django.apps import AppConfig
classYourAppConfig(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, поэтому, если вы хотите, чтобы они отображались в одном приложении, вы должны определить это имя во всех моделях вашего приложения.
У меня были проблемы с этим в админке. От app_label так много зависит, что когда я начал менять имя, все это сломалось.
Joe J
Я знаю, что закончил тем, что написал шаблон, в котором был dict с привязкой app_url: app_name.
Frost.baka
58
Обратите внимание: это НЕ то же самое, что подробное имя, в том смысле, что оно влияет только на то, что отображается пользователю. Это буквальная строка, используемая для наименования таблицы в базе данных, которая требует миграции схемы, если вы меняете существующую модель.
Cerin
6
Не думаю, что это хорошее решение. У него слишком много других неэстетичных побочных эффектов.
Дэвид Сандерс
Этот популярный ответ рекомендует использовать хак / обходной путь, который был необходим до Django 1.7. Если вы используете версию 1.7 или выше, используйте файл apps.py, как рекомендовано iMaGiNiX ниже.
shacker
41
Как указано в комментарии rhunwicks к OP, теперь это возможно из коробки, так как Django 1.7
Он работает хорошо, но код в файле init .py не требуется, если вы устанавливаете приложение в качестве примера рекомендации Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
Роберт Солис
31
Если у вас более одной модели в приложении, просто создайте модель с метаинформацией и создайте подклассы этого класса для всех ваших моделей.
Не надейтесь. Вам также необходимо скопировать представление индекса из django.contrib.admin.sites в ваше собственное представление ProjectAdminSite и включить его в свой собственный экземпляр администратора:
Итак, я запустил приложение под названием todo и теперь решил, что хочу, чтобы оно называлось « Задачи» . Проблема в том, что у меня уже есть данные в моей таблице, поэтому моя работа была следующей. Помещено в models.py:
Для Django 1.4 (еще не выпущенного, но транк довольно стабилен) вы можете использовать следующий метод. Он основан на том факте, что AdminSite теперь возвращает TemplateResponse, который вы можете изменить до его визуализации.
Здесь мы делаем небольшое исправление обезьяны, чтобы добавить наше поведение, чего можно избежать, если вы используете собственный подкласс AdminSite.
from functools import wraps
defrename_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 isnotNone:
for a in app_list:
name = a['name']
a['name'] = m.get(name, name)
title = response.context_data.get('title')
if title isnotNone:
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)
Это исправляет представления index и app_index. Он не исправляет хлебные крошки во всех других представлениях администратора.
Несколько педантичных замечаний: создание файла с именем apps.pyне обязательно. Подойдет любое имя (но вы должны указать его в __init__.py). Как уже было сказано в других комментариях, этот код работает для django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ).
furins 02 фев.15,
Он работает хорошо, но код в файле init .py не требуется, если вы устанавливаете приложение в качестве примера рекомендации Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
Роберт Солис
6
Нет, но вы можете скопировать шаблон администратора и указать там название приложения.
У вас есть verbose_name, однако вы также хотите настроить app_label для другого отображения в админке. К сожалению, наличие произвольной строки (с пробелами) не работает, и в любом случае она не отображается.
Оказывается, админ использует app_label. title () для отображения, чтобы мы могли немного взломать: подкласс str с переопределенным методом заголовка:
classStuff(models.Model):classMeta:
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'
а в качестве имени приложения администратор покажет «Поле для материалов».
Если у вас уже есть таблицы, использующие старое имя приложения, и вы не хотите их переносить, просто установите app_label на прокси-сервере исходной модели.
Имейте в виду, что URL-адрес будет / admin / NewAPPname / mynewmodel /, поэтому вы можете просто убедиться, что имя класса для новой модели выглядит как можно ближе к старой модели.
Следующий фрагмент кода plug-and-play отлично работает с тех пор 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"defget_current_app_name(file):return path.dirname(file).replace('\\', '/').split('/')[-1]
classAppVerboseNameConfig(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функцию во вспомогательный файл.
Ответы:
Django 1.8+
Согласно документации 1.8 (и текущим документам ),
Пример:
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 и теперь решил, что хочу, чтобы оно называлось « Задачи» . Проблема в том, что у меня уже есть данные в моей таблице, поэтому моя работа была следующей. Помещено в 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)
Это исправляет представления index и app_index. Он не исправляет хлебные крошки во всех других представлениях администратора.
источник
Сначала вам нужно создать такой
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
Для человека, у которого были проблемы с испанским
Этот код обеспечивает совместимость с utf-8 в скриптах python2
# -*- coding: utf-8 -*-
источник
apps.py
не обязательно. Подойдет любое имя (но вы должны указать его в__init__.py
). Как уже было сказано в других комментариях, этот код работает для django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ).Нет, но вы можете скопировать шаблон администратора и указать там название приложения.
источник
Есть хак, который можно сделать, не требуя никаких миграций. Взято из блога Ионела, и его заслуга: 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, однако вы также хотите настроить app_label для другого отображения в админке. К сожалению, наличие произвольной строки (с пробелами) не работает, и в любом случае она не отображается.
Оказывается, админ использует 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'
а в качестве имени приложения администратор покажет «Поле для материалов».
"" "
источник
Если у вас уже есть таблицы, использующие старое имя приложения, и вы не хотите их переносить, просто установите 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 /, поэтому вы можете просто убедиться, что имя класса для новой модели выглядит как можно ближе к старой модели.
источник
Что ж, у меня это работает. В app.py используйте это:
class MainConfig(AppConfig): name = 'main' verbose_name="Fancy Title"
В setting.py добавьте имя приложения и имя класса, присутствующее в файле 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',
]
источник
Следующий фрагмент кода plug-and-play отлично работает с тех пор
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
функцию во вспомогательный файл.источник