기본 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의 경우 위의 답변에서 제안한 대로 링크하거나 관리자/템플릿을 프로젝트 폴더에 복사하거나 미들웨어를 설치할 필요가 없습니다.다음은 수행할 작업입니다.
다음 트리 구조 생성(공식 문서에서 권장)
your_project |-- your_project/ |-- myapp/ |-- templates/ |-- admin/ |-- myapp/ |-- change_form.html <- do not misspell this
참고: 이 파일의 위치는 중요하지 않습니다.당신은 그것을 당신의 앱 안에 넣을 수 있고 그것은 여전히 작동할 것입니다.장고가 그 위치를 발견할 수 있는 한.더 중요한 것은 HTML 파일의 이름이 django에서 제공하는 원래 HTML 파일 이름과 같아야 한다는 것입니다.
이 템플릿 경로를 설정에 추가합니다.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_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/
다음은 여러분이 해야 할 일입니다.
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_siteadmin.CustomAdminSite이전 단계부터:from django.contrib.admin.apps import AdminConfig class CustomAdminConfig(AdminConfig): default_site = 'admin.CustomAdminSite'mysite/settings.py, 파일 이름django.admin.siteINSTALLED_APPS와 함께apps.CustomAdminConfig(이전 단계의 사용자 지정 관리 앱 구성).mysite/urls.py, 파일 이름admin.site.urls에서 "URL"로 이동합니다.custom_admin_site.urlsfrom .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)), ... ]을 에서수 합니다.
templates디렉토리. 문서에 지정된 기본 Django 관리 템플릿 디렉토리 구조를 유지합니다.예를 들어, 다음을 수정하는 경우admin/index.html합니다.templates/admin/index.html.기존의 모든 템플릿은 이러한 방식으로 수정할 수 있으며, 이름과 구조는 장고의 소스 코드에서 찾을 수 있습니다.
이제 템플릿을 처음부터 다시 작성하여 재정의하거나 확장한 다음 특정 블록을 재정의/확장할 수 있습니다.
예를 들어 모든 것을 현재 상태로 유지하고 싶지만 다음을 재정의하려는 경우
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
'codememo' 카테고리의 다른 글
| Show navbar 메뉴는 사용자 인증에 따라 다릅니다. (0) | 2023.06.07 |
|---|---|
| SQL Server에 대한 메이븐 종속성 설정 (0) | 2023.06.07 |
| WordPress 검색 결과의 빵 조각 (0) | 2023.06.07 |
| 아래쪽 테두리를 보십니까? (0) | 2023.06.07 |
| 오류: 'closure' 유형의 개체가 하위 집합 테이블이 아닙니다. (0) | 2023.06.07 |