Переопределить текстовую метку по умолчанию для любых внешних пакетов в Django admin - PullRequest
0 голосов
/ 01 марта 2019

Это классический способ описания модулей в Django Admin, и он прекрасно работает!

на bookshelf / apps.py

from django.apps import AppConfig
class BOOKConfig(AppConfig):
    name = 'bookshelf'
    verbose_name = "Your Book"

на bookshelf/__init__.py:

default_app_config = 'bookshelf.apps.BOOKConfig'

НО, если вы хотите переопределить заголовки внешних модулей (например, пакеты из https://djangopackages.org/),, как правильно переопределить имя по умолчанию в этих разделах и элементы внутри него?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Предположим, у вас есть такая модель:

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 () для отображения, так что мы можем сделать небольшой подкласс hack: str с переопределенным методом title:

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'

Оригинальный пост Ионеляhttps://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

0 голосов
/ 01 марта 2019

Как говорят документы , новые приложения должны избегать default_app_config.

Вместо добавления default_app_config к __init__.py приложения, просто используйте пунктирный путь к конфигурации приложения в INSTALLED_APPS.

INSTALLED_APPS = [
    ...
    'bookshelf.apps.BOOKConfig'
    ...
]

Для стороннего приложения вы можете сделать то же самое.Создайте apps.py где-нибудь в своем проекте (например, рядом с myproject/settings.py) и создайте конфигурацию приложения.

from third_party_app..apps import ThirdPartyConfig

class MyThirdPartyConfig(ThirdPartyConfig):
    verbose_name = "Customized app name"

Если приложение не имеет класса App Config, тогда подкласс AppConfig иубедитесь, что вы установили name.

from django.apps import AppConfig
class MyThirdPartyConfig(AppConfig):
    name = 'third_party_app'
    verbose_name = "Customized app name"

Затем используйте путь к вашему классу конфигурации приложения в INSTALLED_APPS вместо имени приложения / конфигурации приложения по умолчанию.

INSTALLED_APPS = [
    ...
    'myproject.apps.MyThirdPartyConfig,
    ...
]

См. для пользователей приложения раздел документации для другого примера.

...