Можете ли вы дать приложению Django подробное имя для использования всем администратором?

118

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

  • 4
    Этот билет будет адресован этому: code.djangoproject.com/ticket/3591 . К сожалению, не похоже, что это будет интегрировано в Django в ближайшее время ...
  • 10
    Начиная с Django 1.7 это теперь возможно из коробки - см. Docs.djangoproject.com/en/1.7/ref/applications/…
Теги:

12 ответов

116
Лучший ответ

До Django 1.7

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

class MyModel(models.Model):
        pass
    class Meta:
        app_label = 'My APP name'

Django 1.7 +

Как указано в комментариях rhunwicks к OP, теперь это возможно из коробки с Django 1.7

Взято из docs:

# 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'
  • 12
    У меня были проблемы с этим в админе. От app_label зависит так много, что когда я начал менять имя, это сломало этот материал.
  • 0
    Я знаю, что я закончил тем, что написал шаблон, в котором была привязка app_url: app_name.
Показать ещё 6 комментариев
32

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

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

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

Как указано в комментариях rhunwicks к OP, теперь это возможно из коробки с Django 1.7

Взято из docs:

# 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'
  • 0
    Он хорошо работает, но код в файле init .py не требуется, если вы устанавливаете приложение в качестве примера рекомендации Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
11

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

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

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

11

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

Для 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

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

5

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

Изображение 927

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

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

# -*- coding: utf-8 -*-
  • 0
    Несколько замечаний: создание файла с именем apps.py не является обязательным. Подойдет любое имя (но вы должны ссылаться на него в __init__.py ). Как уже говорилось в других комментариях, этот код работает для django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ).
  • 0
    Он хорошо работает, но код в файле init .py не требуется, если вы устанавливаете приложение в качестве примера рекомендации Django в INTALLED_APPS: 'App_name.apps.AppnameConfig'
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 тоже для другого отображения в admin. Unfortunatelly с некоторой произвольной строкой (с пробелами) не работает, и это не для отображения в любом случае.

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

а администратор отобразит "Ящик материалов" в качестве имени приложения.

""

3

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

  • 1
    Хотите узнать, как использовать django-admin-tools для фактического изменения отображаемого имени приложения?
  • 2
    Просто не используйте AppList, используйте ModelList для создания панелей мониторинга. [rant] Я думаю, что использовать имена приложений (и полагаться на них) в любом месте пользовательского интерфейса - это ужасное решение, потому что вся концепция «приложения django» предназначена для организации исходного кода , а не для организации пользовательского интерфейса. Приложения Django не имеют ничего общего с пользовательским интерфейсом. Имена приложений можно использовать, чтобы быстро получить представление пользовательского интерфейса по умолчанию, но если вы начнете настраивать администратора, то думать об именах приложений не очень хороший путь вперед. [/ Напыщенная]
Показать ещё 2 комментария
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/, поэтому вы можете просто захотеть убедиться, что имя класса для новой модели будет как можно ближе к старой модели.

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 на вспомогательный файл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню