관리자 템플릿 (예 : admin / index.html)을 확장하면서 동시에 재정의하는 방법 ( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing 참조) -an-admin-template )?
첫째-이 질문이 이전에 묻고 답한 적이 있다는 것을 알고 있지만 ( Django : 앱 템플릿 재정의 및 확장 참조 ) 대답에서 알 수 있듯이 app_directories 템플릿 로더를 사용하는 경우에는 직접 적용 할 수 없습니다 (대부분의 시각).
현재 해결 방법은 관리 템플릿에서 직접 확장하는 대신 복사본을 만들고 확장하는 것입니다. 이것은 훌륭하게 작동하지만 정말 혼란스럽고 관리 템플릿이 변경되면 추가 작업이 추가됩니다.
템플릿에 대한 사용자 지정 확장 태그를 생각할 수 있지만 이미 솔루션이있는 경우 바퀴를 재발 명하고 싶지 않습니다.
참고 :이 문제가 Django 자체에서 해결되는지 아는 사람이 있습니까?
답변
업데이트 :
사용중인 Django 버전에 대한 문서를 읽어보세요. 예 :
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates
https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -템플릿
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="https://stackoverflow.com/admin/extra/">My extra link</a>
</div>
{% endblock %}
내 웹 사이트 의 블로그 게시물 에서이 템플릿 로더를 사용하는 방법에 대한 전체 예제를 제공했습니다 .
답변
Django 1.8이 현재 릴리스이므로 심볼릭 링크, 관리자 / 템플릿을 프로젝트 폴더에 복사하거나 위의 답변에서 제안한 미들웨어를 설치할 필요가 없습니다. 수행 할 작업은 다음과 같습니다.
-
다음과 같은 트리 구조 생성 ( 공식 문서에서 권장 )
your_project |-- your_project/ |-- myapp/ |-- templates/ |-- admin/ |-- myapp/ |-- change_form.html <- do not misspell this
참고 :이 파일의 위치는 중요하지 않습니다. 앱 안에 넣을 수 있으며 여전히 작동합니다. 장고가 그 위치를 찾을 수있는 한. 더 중요한 것은 HTML 파일의 이름이 django에서 제공하는 원래 HTML 파일 이름과 동일해야한다는 것입니다.
-
이 템플릿 경로를 settings.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', ], }, }, ]
-
재정의하려는 이름과 블록을 식별합니다. 이것은 django의 admin / templates 디렉토리를 조사함으로써 이루어집니다. virtualenv를 사용하고 있으므로 경로는 다음과 같습니다.
~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
이 예에서는 새 사용자 추가 양식을 수정하려고합니다. 이 뷰에 응답하는 템플릿은 change_form.html 입니다. change_form.html을 열고 확장하려는 {% block %}을 찾으십시오.
-
에서 당신의 change_form.html , 쓰기 일도이 맘에 :
{% extends "admin/change_form.html" %} {% block field_sets %} {# your modification here #} {% endblock %}
-
페이지를로드하면 변경 사항이 표시됩니다.
답변
을 덮어 써야하는 경우 admin/index.html
의 index_template 매개 변수를 설정할 수 있습니다 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.5modeladmin
참조 https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options를
다음과 같이 할 수 있습니다.
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/#overriding-admin-templates
앱 또는 모델별로 재정의 될 수있는 템플릿
contrib / admin / templates / admin의 모든 템플릿이 앱 또는 모델별로 재정의되는 것은 아닙니다. 다음을 수행 할 수 있습니다.
app_index.html change_form.html change_list.html delete_confirmation.html object_history.html
사람들을 위해 재정의 할 수 없습니다 템플릿 이 방법으로, 당신은 여전히 전체 프로젝트를 오버라이드 (override) 할 수 있습니다. 그냥 배치 당신의 새로운 버전을 템플릿 / 관리자 디렉토리. 이것은 사용자 지정 404 및 500 페이지를 만드는 데 특히 유용합니다.
관리자의 login.html을 덮어 써야했기 때문에 덮어 쓴 템플릿을 다음 폴더 구조에 넣어야했습니다.
your_project
|-- your_project/
|-- myapp/
|-- templates/
|-- admin/
|-- login.html <- do not misspell this
(관리자에 myapp 하위 폴더가 없음) Cheng의 게시물에 댓글을 달기에 충분한 평판이 없기 때문에 이것을 새로운 답변으로 작성해야했습니다.
답변
가장 좋은 방법은 프로젝트에 Django 관리 템플릿을 넣는 것입니다. 따라서 귀하의 템플릿은 templates/admin
재고 Django 관리 템플릿이있는 동안에있을 것입니다 template/django_admin
. 그런 다음 다음과 같은 작업을 수행 할 수 있습니다.
templates / admin / change_form.html
{% extends 'django_admin/change_form.html' %}
Your stuff here
주식 템플릿을 최신 상태로 유지하는 것이 걱정되는 경우 svn externals 또는 이와 유사한 템플릿을 포함 할 수 있습니다.
답변
기본 관리 템플릿을 재정의 / 확장하는 데 필요한 모든 정보 가 포함 된 공식 Django 문서에서 단일 답변이나 섹션을 찾을 수 없었기 때문에이 답변을 완전한 가이드로 작성하고 있습니다. 미래의 다른 사람들을 위해.
표준 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/
수행해야 할 작업은 다음과 같습니다.
-
에서
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
앱에 (원하실 경우) 사용자 정의 관리자 사이트에 표시 할에 모델을 등록합니다. -
에서
mysite/apps.py
의 하위 클래스를AdminConfig
만들고 이전 단계에서로 설정default_site
합니다admin.CustomAdminSite
.from django.contrib.admin.apps import AdminConfig class CustomAdminConfig(AdminConfig): default_site = 'admin.CustomAdminSite'
-
에서
mysite/settings.py
대체django.admin.site
에INSTALLED_APPS
로apps.CustomAdminConfig
(이전 단계에서 사용자 지정 관리 응용 프로그램 설정). -
에서
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)), ... ]
-
docs에
templates
지정된 기본 Django 관리 템플릿 디렉터리 구조를 유지하면서 디렉터리 에서 수정할 템플릿을 만듭니다 . 예를 들어를 수정 하는 경우 파일을 만듭니다 .admin/index.html
templates/admin/index.html
기존의 모든 템플릿은이 방법으로 수정할 수 있으며 이름과 구조는 Django의 소스 코드 에서 찾을 수 있습니다 .
-
이제 템플릿을 처음부터 작성하여 재정의하거나 확장 한 다음 특정 블록을 재정의 / 확장 할 수 있습니다.
예를 들어 모든 것을있는 그대로 유지하고 싶지만
content
블록 (인덱스 페이지에 등록한 앱과 해당 모델이 나열 됨) 을 재정의 하려면 다음을 추가하십시오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
블록 을 수정하여 사용자 스타일과 스크립트를 추가 할 수도 있습니다 .
