Таким же чином, як ви можете надати полям і моделям багатослівні імена, які відображаються в адміністраторі Django, чи можете ви надати додатку спеціальне ім’я?
Таким же чином, як ви можете надати полям і моделям багатослівні імена, які відображаються в адміністраторі Django, чи можете ви надати додатку спеціальне ім’я?
Відповіді:
Джанго 1.8+
За 1,8 документа (та поточні документи ),
Нові програми повинні уникати
default_app_config
. Натомість вони повинні вимагати пунктирного шляху до відповідногоAppConfig
підкласу, який має бути чітко налаштований уINSTALLED_APPS
.
Приклад:
INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]
Потім змініть свої, AppConfig
як зазначено нижче.
Джанго 1.7
Як зазначається в коментарі rhunwicks до ОП, це стає можливим поза межами, оскільки 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'
До Джанго 1.7
Ви можете надати додатку власну назву, визначивши app_label у визначенні своєї моделі. Але оскільки django створює сторінку адміністратора, вона буде хеш-моделями за їх app_label, тому, якщо ви хочете, щоб вони з'являлися в одній програмі, ви повинні визначити це ім'я у всіх моделях вашої програми.
class MyModel(models.Model):
pass
class Meta:
app_label = 'My APP name'
Як зазначається в коментарі rhunwicks до ОП, це стає можливим поза межами, оскільки 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)
Це виправляє індекс та подання 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/… ).
Можна зробити злом, який не потребує міграцій. Взяте з блогу 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, проте ви також хочете налаштувати 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"
У налаштуваннях.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',
]
Наступний фрагмент коду працює як ідеально 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
функцію на файл-помічник.