Можете ли вы дать приложению Django подробное имя для использования всем администратором? - PullRequest
133 голосов
/ 04 марта 2009

Точно так же, как вы можете задавать подробные имена полей и моделей, которые появляются в админке Django, можете ли вы дать приложению собственное имя?

Ответы [ 12 ]

166 голосов
/ 02 июля 2010

Джанго 1,8 +

По 1,8 документов текущих документов ),

Новые приложения должны избегать default_app_config. Вместо этого им нужно, чтобы пунктирный путь к соответствующему подклассу AppConfig был явно настроен в INSTALLED_APPS.

Пример:

INSTALLED_APPS = [
    # ...snip...
    'yourapp.apps.YourAppConfig',
]

Затем измените ваш AppConfig, как указано ниже.

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

До Джанго 1,7

Вы можете дать своему приложению собственное имя, определив app_label в определении модели. Но когда django создает страницу администратора, она будет хэшировать модели по их app_label, поэтому, если вы хотите, чтобы они появлялись в одном приложении, вы должны определить это имя во всех моделях вашего приложения.

class MyModel(models.Model):
        pass
    class Meta:
        app_label = 'My APP name'
37 голосов
/ 02 декабря 2014

Как говорится в комментарии 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'
31 голосов
/ 28 апреля 2011

Если в приложении более одной модели, просто создайте модель с метаинформацией и создайте подклассы этого класса для всех ваших моделей.

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

class Category(MyAppModel):
     name = models.CharField(max_length=50)
12 голосов
/ 02 сентября 2010

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

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

Надеюсь, это поможет.

12 голосов
/ 05 марта 2009

Дайте им свойство 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

Пока вы настраиваете индексное представление, почему бы не добавить свойство 'order' тоже.

7 голосов
/ 18 ноября 2014

Сначала вам нужно создать 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

My custom App Name

Для человека, у которого были проблемы с испанским

Этот код включает совместимость с utf-8 в скриптах python2

# -*- coding: utf-8 -*-
7 голосов
/ 11 июня 2011

Для 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. Он не исправляет хлебные крошки во всех других представлениях администратора.

6 голосов
/ 05 марта 2009

Нет, но вы можете скопировать шаблон администратора и указать там имя приложения.

3 голосов
/ 11 сентября 2014

Существует возможность взлома, не требующая миграции. Взято из блога Ионеля, и ему зачисляется: 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 для другого отображения в admin. К сожалению, наличие некоторой произвольной строки (с пробелами) не работает, и все равно не для отображения.

Оказывается, что админ использует 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'

и администратор покажет «Коробку с вещами» в качестве имени приложения.

"" "

3 голосов
/ 15 февраля 2011

Я использую django-admin-tools для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...