Чи можете ви надати програмі Django багатослівне ім'я для використання у адміністратора?


140

Таким же чином, як ви можете надати полям і моделям багатослівні імена, які відображаються в адміністраторі Django, чи можете ви надати додатку спеціальне ім’я?


4
Цей квиток стосується цього: code.djangoproject.com/ticket/3591 . На жаль, це не здається, що воно незабаром буде інтегровано у Django ...
Бенджамін Вольвенд,

10
Станом на Django 1.7 це стає можливим зараз - див. Docs.djangoproject.com/en/1.7/ref/applications/…
rhunwicks

Відповіді:


182

Джанго 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'

12
У мене були проблеми з цим у адміністратора. Настільки багато залежить від app_label, що коли я почав змінювати ім'я, він зламав цей матеріал.
Джо Дж.

Я знаю, я закінчив писати шаблон, який мав дікта з прив’язкою app_url: app_name.
Frost.baka

58
Зауважте, це НЕ те саме, що багатослівне ім'я, в тому сенсі, що воно впливає лише на те, що показано користувачеві. Це буквальна рядок, який використовується для іменування таблиці в базі даних, що вимагає міграції схеми, якщо ви змінюєте існуючу модель.
Серін

6
Я не думаю, що це хороше рішення. У нього занадто багато інших побічних ефектів, які не є естетичними.
Девід Сандерс

Ця популярна відповідь рекомендує використовувати хак / вирішення, яке було потрібно до Django 1.7. Якщо ви використовуєте 1.7 або вище, використовуйте файл apps.py, як рекомендовано нижче iMaGiNiX.
шейкер

38

Як зазначається в коментарі 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'

Це добре прокидається, але код у файлі init .py не потрібен, якщо ви встановите додаток як приклад рекомендації Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
Роберт Соліс

31

Якщо у вас є кілька моделей у додатку, просто створіть модель з інформацією про мета та створіть підкласи цього класу для всіх своїх моделей.

class MyAppModel(models.Model):
    class Meta:
        app_label = 'My App Label'
        abstract = True

class Category(MyAppModel):
     name = models.CharField(max_length=50)

12

Дайте їм властивість 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

Поки ви налаштовуєте індексний вигляд, чому б не додати також властивість "замовлення".


12

Ну, я запустив додаток під назвою todo, і тепер вирішив, що хочу його назвати Завдання . Проблема полягає в тому, що я вже маю дані всередині своєї таблиці, тому моя робота була такою. Розміщений у models.py:

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

Сподіваюся, це допомагає.


7

Для 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. Це не виправляє сухарі у всіх інших видах адміністратора.


7

Спочатку потрібно створити такий 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/… ).
furins

Це добре прокидається, але код у файлі init .py не потрібен, якщо ви встановите додаток як приклад рекомендації Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
Роберт Соліс

6

Ні, але ви можете скопіювати шаблон адміністратора та визначити ім'я програми там.


3

Можна зробити злом, який не потребує міграцій. Взяте з блогу 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'

і адміністратор покаже "Вікно матеріалу" як назву програми.

"" "


2

Якщо у вас вже є таблиці з використанням старої назви програми, і ви не хочете їх переміщувати, просто встановіть 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 /, тому ви можете просто переконатися, що ім'я класу для нової моделі виглядає максимально наближеним до старої моделі.


1

Ну, це для мене працює. У 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',

]


0

Наступний фрагмент коду працює як ідеально 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функцію на файл-помічник.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.