관리자에게 Django 앱에 자세한 이름을 지정할 수 있습니까?


140

Django 관리자에 표시되는 필드와 모델에 자세한 이름을 지정할 수있는 것과 같은 방식으로 앱에 사용자 지정 이름을 지정할 수 있습니까?


4
이 티켓의 주소는 code.djangoproject.com/ticket/3591 입니다. 그것이 곧 장고에 통합 될 것이다 불행하게도, 그것은 ...하지 않는 것
벤자민 Wohlwend에게

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의 OP에 대한 언급에서 알 수 있듯이, 이것은 장고 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에 따라 너무 많은 이름을 변경하기 시작했을 때, 그것은 그 것들을 깨뜨 렸습니다.
Joe J

나는 app_url : app_name 바인딩이있는 templatag를 작성했다.
Frost.baka

58
이 이름은 사용자에게 표시되는 내용에만 영향을 준다는 점에서 자세한 이름과 다릅니다. 데이터베이스에서 테이블 이름을 지정하는 데 사용되는 리터럴 문자열이므로 기존 모델을 변경하는 경우 스키마 마이그레이션이 필요합니다.
Cerin

6
나는 이것이 좋은 해결책이라고 생각하지 않습니다. 미학적이지 않은 다른 부작용이 너무 많습니다.
David Sanders

이 인기있는 답변은 Django 1.7 이전에 필요한 해킹 / 해결 방법을 사용하는 것이 좋습니다. 1.7 이상을 사용하는 경우 iMaGiNiX에서 권장하는 apps.py 파일을 사용하십시오.
shacker

38

rhunwicks의 OP에 대한 언급에서 알 수 있듯이, 이것은 장고 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'

그것은 잘 웍 만의 코드를 초기화 하면 INTALLED_APPS에서 장고 권고가 예제로 응용 프로그램을 설치하는 경우 평 파일은 필요하지 않습니다 : 'App_name.apps.AppnameConfig'
Roberth 솔리스

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

인덱스 뷰를 조정하는 동안 'order'속성도 추가하지 마십시오.


12

글쎄, todo 라는 앱을 시작했고 이제 Tasks 라는 이름을 지정하기로 결정했습니다 . 문제는 이미 테이블에 데이터가 있으므로 해결 방법은 다음과 같습니다. models.py에 배치 :

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

도움이 되길 바랍니다.


7

Django 1.4 (아직 출시되지 않았지만 트렁크는 매우 안정적)의 경우 다음 방법을 사용할 수 있습니다. AdminSite는 이제 TemplateResponse를 반환한다는 사실에 의존합니다. 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'

가장 좋은 방법입니다. 장고 1.7에서 테스트

내 맞춤 앱 이름

스페인어에 문제가있는 사람

이 코드는 python2 스크립트에서 utf-8 호환성을 활성화합니다

# -*- coding: utf-8 -*-

몇 가지 간단한 참고 사항 : 이름 apps.py이 지정된 파일을 만드는 것은 필수가 아닙니다. 모든 이름은 괜찮습니다 (그러나에서 참조해야 함 __init__.py). 다른 의견에서 이미 언급 했듯이이 코드는 django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… )에서 작동합니다.
furins

그것은 잘 웍 만의 코드를 초기화 하면 INTALLED_APPS에서 장고 권고가 예제로 응용 프로그램을 설치하는 경우 평 파일은 필요하지 않습니다 : 'App_name.apps.AppnameConfig'
Roberth 솔리스

6

아니요, 그러나 관리자 템플릿을 복사하고 거기에서 앱 이름을 정의 할 수 있습니다.


3

마이그레이션이 필요없는 해킹이 있습니다. Ionel의 블로그에서 가져와 신용은 다음과 같습니다. http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

장고 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 ()을 표시하여 오버라이드 된 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"

setting.py에서 App의 이름과 App 폴더의 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기능을 사용하는 경우 도우미 파일에 함수를 제외시켜야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.