source

관리자 전체에서 사용할 수 있도록 장고 앱에 자세한 이름을 지정할 수 있습니까?

nicesource 2023. 7. 18. 21:48
반응형

관리자 전체에서 사용할 수 있도록 장고 앱에 자세한 이름을 지정할 수 있습니까?

장고 관리자에 나타나는 필드와 모델에 자세한 이름을 지정할 수 있는 것과 마찬가지로 앱에 사용자 지정 이름을 지정할 수 있습니까?

장고 1.8+

1.8개 문서(및 현재 문서)에 따라

새로운 애플리케이션은 방지해야 합니다.default_app_config대신 적절한 경로에 대한 점선이 필요합니다.AppConfig는 명적으클래에서 되어야 합니다.INSTALLED_APPS.

예:

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

그런 다음 변경합니다.AppConfig아래에 열거된 바와 같이

장고 1.7

런윅스가 OP에 언급한 것처럼, 장고 1.7 이후로 이것은 즉시 가능합니다.

문서에서 가져온 것:

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

그런 다음 설정합니다.default_app_config to 게가인적변에.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'

런윅스가 OP에 언급한 것처럼, 장고 1.7 이후로 이것은 즉시 가능합니다.

문서에서 가져온 것:

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

그런 다음 설정합니다.default_app_config to 게가인적변에.YourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

앱에 두 개 이상의 모델이 있는 경우 메타 정보로 모델을 만들고 모든 모델에 대해 해당 클래스의 하위 클래스를 만듭니다.

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

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

저는 to do라는 앱을 시작했고 이제 그것을 Tasks로 명명하기로 결정했습니다.문제는 제 테이블에 이미 데이터가 있어서 제 작업은 다음과 같습니다.모델에 배치됩니다.py:

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

도움이 되길 바랍니다.

verbose_name 속성을 지정합니다.

기대하지 말아요.또한 django.contrib.admin에서 인덱스 보기를 복사해야 합니다.사이트를 사용자의 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

인덱스 보기를 조정하는 동안 '주문' 속성도 추가하십시오.

먼다을생야합니다해성을 합니다.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

스페인 사람들과 문제가 있었던 사람을 위해.

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

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

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 보기가 수정됩니다.다른 모든 관리 보기에서 빵 부스러기를 해결하지는 않습니다.

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

마이그레이션이 필요 없는 해킹이 가능합니다.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을(를) 가지고 있지만 admin에서 다른 표시를 위해 app_label도 사용자 지정하려고 합니다.안타깝게도 일부 임의 문자열(공백 포함)은 작동하지 않으며 표시용이 아닙니다.

관리자가 app_label.title()을 표시에 사용하는 것으로 밝혀졌습니다. 그래서 우리는 약간의 hack: str subclass with overriden 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'

관리자가 "The stuff box"를 앱 이름으로 표시합니다.

"""

이전 앱 이름을 사용하는 기존 테이블이 있지만 마이그레이션하지 않으려면 원래 모델의 프록시에 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

그러면 관리자에서 이 항목을 변경하면 됩니다.py:

#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)

URL은 /admin/NewAPPname/mynewmodel/이 되므로 새 모델의 클래스 이름이 가능한 한 이전 모델에 가깝게 보이도록 해야 합니다.

음, 이것은 저에게 효과가 있습니다.app.py 에서 다음을 사용합니다.

class MainConfig(AppConfig):
    name = 'main'
    verbose_name="Fancy Title"

setting.py 에서 App 폴더의 app.py 파일에 있는 App 이름과 클래스 이름을 추가합니다.

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

]

간단히 appName/apps에 다음과 같이 추가하면 됩니다.

class AppNameConfig(AppConfig):
    default_auto_field = 'default Django'
    name = 'AppName'
    verbose_name = 'Name you Want'

다음 플러그 앤 플레이 코드는 다음 이후로 완벽하게 작동합니다.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도움말 파일에 대한 함수입니다.

2021년 업데이트(장고 3.2):

앱의 app.py 파일 안에 AppClientsConfig 클래스가 있습니다.내부에는 이름 속성이 있습니다.꼭 변경해야 하는 경우를 제외하고는 변경하지 마십시오. 그러면 settings.py 파일 내의 앱 레지스트리도 변경해야 합니다.

대신 클래스에 다음과 같은 속성을 추가합니다.

verbose_name = "The Name You Like"

그것이 효과가 있어야 해요.Django 공식 문서 페이지에서 그것에 대해 더 자세히 읽어보세요.

언급URL : https://stackoverflow.com/questions/612372/can-you-give-a-django-app-a-verbose-name-for-use-throughout-the-admin

반응형