codememo

기본 Django 관리 템플릿을 재정의하고 확장하는 방법은 무엇입니까?

tipmemo 2023. 6. 7. 22:56
반응형

기본 Django 관리 템플릿을 재정의하고 확장하는 방법은 무엇입니까?

관리 템플릿을 확장하는 동시에 관리 템플릿(예: admin/index.dll)을 재정의하는 방법은 무엇입니까(https://docs.djangoproject.com/en/dev/ref/contrib/admin/ #dlliding-vs-dll-an-admin-dll 참조)?

첫 번째 - 이 질문은 이전에 질의응답을 한 적이 있는 것으로 알고 있습니다(장고: 템플릿을 재정의하고 확장)하지만 답변에 따르면 app_directories 템플릿 로더를 사용하는 경우(대부분의 경우) 직접 적용할 수 없습니다.

현재 해결 방법은 관리 템플릿에서 직접 확장하는 대신 복사본을 만들어 확장하는 것입니다.이것은 잘 작동하지만 관리 템플릿이 변경되면 정말 혼란스럽고 추가 작업이 추가됩니다.

템플릿에 대한 맞춤형 확장 태그를 생각해 볼 수도 있지만, 이미 해결책이 있다면 바퀴를 다시 만들고 싶지 않습니다.

참고 사항:이 문제가 장고 자체적으로 해결될지 아는 사람이 있습니까?

업데이트:

Django 버전에 대한 문서를 읽으십시오(예: 최신 버전 또는 이전 LTS 버전: 3.2, 2.2, 1.11).

2011년 원본 답변:

저는 약 1년 반 전에 같은 문제를 겪었고 djangosnippets.org 에서 이 문제를 쉽게 해결할 수 있는 멋진 템플릿 로더를 발견했습니다.특정 앱에서 템플릿을 확장할 수 있으므로 관리 앱에서 admin/index.html 템플릿을 확장하는 자체 admin/index.html을 만들 수 있습니다.다음과 같이:

{% extends "admin:admin/index.html" %}

{% block sidebar %}
    {{block.super}}
    <div>
        <h1>Extra links</h1>
        <a href="/admin/extra/">My extra link</a>
    </div>
{% endblock %}

저는 제 웹사이트의 블로그 게시물에서 이 템플릿 로더를 사용하는 방법에 대한 전체 예를 제시했습니다.

현재 출시된 Django 1.8의 경우 위의 답변에서 제안한 대로 링크하거나 관리자/템플릿을 프로젝트 폴더에 복사하거나 미들웨어를 설치할 필요가 없습니다.다음은 수행할 작업입니다.

  1. 다음 트리 구조 생성(공식 문서에서 권장)

    your_project
         |-- your_project/
         |-- myapp/
         |-- templates/
              |-- admin/
                  |-- myapp/
                      |-- change_form.html  <- do not misspell this
    

참고: 이 파일의 위치는 중요하지 않습니다.당신은 그것을 당신의 앱 안에 넣을 수 있고 그것은 여전히 작동할 것입니다.장고가 그 위치를 발견할 수 있는 한.더 중요한 것은 HTML 파일의 이름이 django에서 제공하는 원래 HTML 파일 이름과 같아야 한다는 것입니다.

  1. 템플릿 경로를 설정에 추가합니다.py:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')], # <- add this line
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
  2. 재정의할 이름과 차단을 식별합니다.이것은 django의 admin/templates 디렉토리를 조사함으로써 이루어집니다.virtualenv를 사용하고 있으므로 경로는 다음과 같습니다.

    ~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
    

이 예에서는 새 사용자 추가 양식을 수정하려고 합니다.이 보기를 담당하는 템플릿은 change_form.html입니다.change_form.html을 열고 확장할 {%block %}을(를) 찾습니다.

  1. change_form.html에 다음과 같은 내용을 기록합니다.

    {% extends "admin/change_form.html" %}
    {% block field_sets %}
         {# your modification here #}
    {% endblock %}
    
  2. 페이지를 로드하면 변경 사항이 표시됩니다.

덮쓸필있경우를 admin/index.htmlindex_proxy 매개 변수를 설정할 수 있습니다.AdminSite.

예.

# urls.py
...
from django.contrib import admin

admin.site.index_template = 'admin/my_custom_index.html'
admin.autodiscover()

을 릿을배다니합에 놓습니다.<appname>/templates/admin/my_custom_index.html

와 함께django 1.5(최소) 템플릿을 할 수 .modeladmin

참조 https://docs.djangoproject.com/en/1.5/ref/contrib/admin/ #custom-messages-messages

당신은 다음과 같은 것을 할 수 있습니다.

class Myadmin(admin.ModelAdmin):
    change_form_template = 'change_form.htm'

와 함께change_form.html확장된 단순한 HTML 템플릿입니다.admin/change_form.html 마세요

Chengs의 대답은 정확하지만 관리자 문서에 따르면 모든 관리 템플릿을 이런 방식으로 덮어쓸 수 있는 것은 아닙니다. https://docs.djangoproject.com/en/1.9/ref/contrib/admin/ #sysiding-admin-template

앱 또는 모델별로 재정의될 수 있는 템플릿

기여/admin/templates/admin의 모든 템플릿을 앱별 또는 모델별로 재정의할 수는 없습니다.다음은 가능합니다.

app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html

이 방법으로 재정의할 수 없는 템플릿의 경우에도 전체 프로젝트에 대해 재정의할 수 있습니다.새 버전을 템플릿/관리 디렉토리에 배치하기만 하면 됩니다.이 기능은 사용자 정의 404 및 500페이지를 만드는 데 특히 유용합니다.

admin의 login.html을 덮어써야 했기 때문에 덮어쓴 템플릿을 다음 폴더 구조에 넣어야 했습니다.

your_project
 |-- your_project/
 |-- myapp/
 |-- templates/
      |-- admin/
          |-- login.html  <- do not misspell this

(관리자에 myapp 하위 폴더가 없음) Cheng의 게시물에 댓글을 달 충분한 평판이 없기 때문에 이것을 새로운 답변으로 써야 했습니다.

기본 관리 템플릿을 재정의/확장하는 데 필요한 모든 정보가 포함된 Django 공식 문서에서 단 하나의 답변이나 섹션을 찾을 수 없었기 때문에, 앞으로 다른 사람들에게 도움이 되기를 바라며 완전한 가이드로 이 답변을 작성합니다.

표준 장고 프로젝트 구조를 가정하면:

mysite-container/         # project container directory
    manage.py
    mysite/               # project package
        __init__.py
        admin.py
        apps.py
        settings.py
        urls.py
        wsgi.py
    app1/
    app2/
    ...
    static/
    templates/

다음은 여러분이 해야 할 일입니다.

  1. mysite/admin.py하클래생의 하위 .AdminSite:

    from django.contrib.admin import AdminSite
    
    
    class CustomAdminSite(AdminSite):
        # set values for `site_header`, `site_title`, `index_title` etc.
        site_header = 'Custom Admin Site'
        ...
    
        # extend / override admin views, such as `index()`
        def index(self, request, extra_context=None):
            extra_context = extra_context or {}
    
            # do whatever you want to do and save the values in `extra_context`
            extra_context['world'] = 'Earth'
    
            return super(CustomAdminSite, self).index(request, extra_context)
    
    
    custom_admin_site = CustomAdminSite()
    

    를 반드시 해 주세요.custom_admin_site에 시대에admin.py사용자 지정 관리 사이트에 표시할 수 있도록 앱을 등록하고 모델을 등록합니다(원하는 경우).

  2. mysite/apps.py하클래생의 하위 .AdminConfig 트세를 합니다.default_siteadmin.CustomAdminSite이전 단계부터:

    from django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
    
  3. mysite/settings.py, 파일 이름django.admin.siteINSTALLED_APPS와 함께apps.CustomAdminConfig(이전 단계의 사용자 지정 관리 앱 구성).

  4. mysite/urls.py, 파일 이름admin.site.urls에서 "URL"로 이동합니다.custom_admin_site.urls

    from .admin import custom_admin_site
    
    
    urlpatterns = [
        ...
        path('admin/', custom_admin_site.urls),
        # for Django 1.x versions: url(r'^admin/', include(custom_admin_site.urls)),
        ...
    ]
    
  5. 을 에서수 합니다.templates디렉토리. 문서에 지정된 기본 Django 관리 템플릿 디렉토리 구조를 유지합니다.예를 들어, 다음을 수정하는 경우admin/index.html합니다.templates/admin/index.html.

    기존의 모든 템플릿은 이러한 방식으로 수정할 수 있으며, 이름과 구조는 장고의 소스 코드에서 찾을 수 있습니다.

  6. 이제 템플릿을 처음부터 다시 작성하여 재정의하거나 확장한 다음 특정 블록을 재정의/확장할 수 있습니다.

    예를 들어 모든 것을 현재 상태로 유지하고 싶지만 다음을 재정의하려는 경우contentblock되어 있음)에 합니다.templates/admin/index.html:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
    {% endblock %}
    

    하려면 블의원내래보용면다려추다음니가합을을 추가합니다.{{ block.super }}원본 내용을 표시할 위치:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
      {{ block.super }}
    {% endblock %}
    

    사용자 .extrastyle그리고.extrahead블록들

가장 좋은 방법은 프로젝트 안에 Django 관리 템플릿을 넣는 것입니다.은 그서당신템플은릿으로 되어 있을 입니다.templates/admin주식 장고 관리 템플릿이 말하는 동안.template/django_admin그런 다음 다음과 같은 작업을 수행할 수 있습니다.

templates/admin/change_form.vmdk

{% extends 'django_admin/change_form.html' %}

Your stuff here

재고 템플릿을 최신 상태로 유지하는 것이 걱정되는 경우 svn 외부 등에 포함할 수 있습니다.

앱 인덱스의 경우 이 행을 url.py 과 같은 일반적인 py 파일에 추가합니다.

admin.site.index_template = 'admin/custom_index.html'

앱 모듈 인덱스의 경우: 관리자에 이 줄을 추가합니다.파이의

admin.AdminSite.app_index_template = "servers/servers-home.html"

변경 목록: 관리 클래스에 이 행을 추가합니다.

change_list_template = "servers/servers_changelist.html"

앱 모듈 양식 템플릿의 경우: 관리자 클래스에 이 줄을 추가합니다.

change_form_template = "servers/server_changeform.html"

같은 관리자의 모듈 클래스에서 다른 사용자를 찾습니다.

저는 크리스 프랫의 말에 동의합니다.하지만 관리 템플릿이 위치한 원래 장고 폴더에 대한 심볼 링크를 생성하는 것이 더 낫다고 생각합니다.

ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/ templates/django_admin

그리고 보시다시피 Python 버전과 Django가 설치된 폴더에 따라 다릅니다.따라서 향후 또는 프로덕션 서버에서 경로를 변경해야 할 수도 있습니다.

여러 가지 방법으로 django 관리 템플릿을 재정의할 수 있습니다.

예를 들어, 다음과 같은 것들이 있습니다.settings.pycore,models.py그리고.admin.pyapp1그리고.templates아래와 같은 폴더:

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py # Here
 |  └-admin.py # Here
 |-app2
 └-templates # Here

그리고나서,BASE_DIR / 'templates'으로 설정됨DIRSTEMPLATESsettings.py 그 록도하록templates폴더는 아래와 같이 인식됩니다.

# "core/settings.py"

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR / 'templates', # Here
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

고리다, 니습있이 있습니다.Food그리고.Drink app1/models.py아래와 같이:

# "app1/models.py"

class Food(models.Model):
    name = models.CharField(max_length=20)

class Drink(models.Model):
    name = models.CharField(max_length=20)

고리다, 니습있이 있습니다.Food그리고.Drink의 .app1/admin.py아래와 같이:

# "app1/admin.py"

@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
    pass

@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
    pass

이제 django 관리 템플릿 change_form.html 중 하나를 재정의할 수 있습니다.templates/admin/,templates/admin/app1/그리고.templates/admin/app1/food/아래와 같이* 재정의할 수 있는 더 많은 django 관리 템플릿을 찾을 수 있으며 일부 django 관리 템플릿은 에서 재정의할 수 없습니다.templates/admin/app1/또는templates/admin/app1/food/그러나 이러한 django 관리 템플릿은 모두에서 재정의될 수 있습니다.templates/admin/,templates/admin/app1/그리고.templates/admin/app1/food/.

change_form.htmltemplates/admin/아래는 모든 앱의 모든 관리자에게 자동으로 적용될 수 있습니다.*소문자 폴더 이름admin올바르게 작동합니다.

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       └-change_form.html # Here

change_form.htmltemplates/admin/app1/는 아는래의모관든자적수있다습니의 될 수 .app1 **소문폴더이름자름이▁*app1올바르게 작동합니다.

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       |-app1
       |  └-change_form.html # Here
       └-app2

change_form.htmltemplates/admin/app1/food/으로 아는자적수있습다니용할에 될 수 .food을 관리하는.app1 **소문폴더이름자름이▁*food올바르게 작동합니다.

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       |-app1
       |  |-food
       |  |  └-change_form.html # Here
       |  └-drink
       └-app2

이제 이름을 변경할 수 있습니다.change_form.htmlcustom_change_form.html그렇지만custom_change_form.html모든 폴더에서 앱의 관리자에게 자동으로 적용할 수 없습니다.으로 따서수로적합니다야용해를 적용해야 .custom_change_form.html적용할 앱의 모든 관리자에게custom_change_form.html

위해서custom_change_form.htmltemplates/admin/아래:아래:아래:

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       └-custom_change_form.html # Here

admin/custom_change_form.html변화시키다, 변화시키다, 변화시키다, 변화시키다, 변화시키다, 변화하다Food그리고.Drink관리자는 아래와 같습니다.*추가 사용자 지정 템플릿 옵션을 찾을 수 있습니다.

# "app1/admin.py"

@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
    change_form_template = 'admin/custom_change_form.html'

@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
    change_form_template = 'admin/custom_change_form.html'

위해서custom_change_form.htmltemplates/admin/app1/아래:아래:아래:

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       |-app1
       |  └-custom_change_form.html # Here
       └-app2

admin/app1/custom_change_form.htmlchange_form_templateFood그리고.Drink관리자는 다음과 같습니다.

# "app1/admin.py"

@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
    change_form_template = 'admin/app1/custom_change_form.html'

@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
    change_form_template = 'admin/app1/custom_change_form.html'

위해서custom_change_form.htmltemplates/admin/app1/food아래:아래:아래:

django-project
 |-core
 |  └-settings.py
 |-app1
 |  |-models.py
 |  └-admin.py
 |-app2
 └-templates
    └-admin
       |-app1
       |  |-food
       |  |  └-custom_change_form.html # Here
       |  └-drink
       └-app2

admin/app1/food/custom_change_form.htmlchange_form_templateFood그리고.Drink관리자는 다음과 같습니다.

# "app1/admin.py"

@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
    change_form_template = 'admin/app1/food/custom_change_form.html'

@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
    change_form_template = 'admin/app1/food/custom_change_form.html'

사이트에는 제 장고 1.7 구성과 함께 작동하는 간단한 솔루션이 있었습니다.

첫 번째: 프로젝트의 템플릿/디렉토리에 admin_src라는 이름의 심볼 링크를 설치된 Django 템플릿으로 만듭니다.가상 환경을 사용하는 Dreamhost의 "소스" Django 관리 템플릿은 다음과 같습니다.

~/virtualenvs/mydomain/lib/python2.7/site-packages/django/contrib/admin/templates/admin

번째: 템플릿에 관리 디렉토리를 만듭니다.

제 프로젝트의 템플릿/디렉토리는 다음과 같습니다.

/templates/
   admin
   admin_src -> [to django source]
   base.html
   index.html
   sitemap.xml
   etc...

셋째: 새 template/admin/ 디렉토리에 다음 내용의 base.html 파일을 만듭니다.

{% extends "admin_src/base.html" %}

{% block extrahead %}
<link rel='shortcut icon' href='{{ STATIC_URL }}img/favicon-admin.ico' />
{% endblock %}

넷째: 관리자 favicon-admin.ico를 정적 루트 img 폴더에 추가합니다.

됐어, 진정해요

장고에 원형 템플릿 상속을 제공하는 장고-오버 확장을 사용할 수 있습니다.

이것은 Stephen이 독립형 Django 확장으로 추출한 메자닌 CMS에서 제공됩니다.

자세한 내용은 "템플릿 재정의 대 확장"(메자닌 문서 내 mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) 참조)에서 확인할 수 있습니다.

자세한 내용은 Stephens 블로그 "장고를 위한 원형 템플릿 상속"(http:/blog.jupo.org/2012/05/17/circular-template-inheritance-for-django) )을 참조하십시오.

그리고 Google 그룹에서 이 기능의 개발을 시작한 토론(https:/groups.google.com/forum/ #!topic/메자닌 사용자/sUydcf_IZKQ).

참고:

저는 링크를 2개 이상 추가할 수 있는 평판이 없습니다.하지만 저는 그 링크들이 흥미로운 배경 정보를 제공한다고 생각합니다.그래서 "http(s):" 뒤에 슬래시를 하나 빠뜨렸습니다.아마도 더 좋은 평판을 가진 누군가가 링크를 복구하고 이 노트를 제거할 수 있을 것입니다.

언급URL : https://stackoverflow.com/questions/6583877/how-to-override-and-extend-basic-django-admin-templates

반응형