python django文檔 - 如何覆蓋和擴展基本的Django管理模板?




django設定 createsuperuser (9)

如何覆蓋管理模板(例如admin / index.html),同時對其進行擴展(請參閱https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template )?

首先 - 我知道這個問題之前已經被詢問和回答過了(請參閱Django:覆蓋和擴展應用程序模板 ),但正如答案所述,如果您使用的是app_directories模板加載器(這是大多數時間)。

我目前的解決方法是複制並擴展它們,而不是直接從管理模板中進行擴展。 這很好用,但是當管理員模板發生變化時,它會讓人感到困惑,並增加額外的工作量。

它可以為模板考慮一些自定義的擴展標籤,但如果已經存在解決方案,我不想重新發明輪子。

在旁注:有人知道Django本身是否會解決這個問題嗎?


Answers

至於Django 1.8是當前版本,不需要符號鏈接,將管理員/模板複製到您的項目文件夾,或按照上述答案中的建議安裝中間件。 這是做什麼:

  1. 創建以下樹形結構(由官方文檔推薦)

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

注意 :這個文件的位置並不重要。 你可以把它放在你的應用程序中,它仍然可以工作。 只要它的位置可以被django發現。 更重要的是,HTML文件的名稱必須與django提供的原始HTML文件名相同。

  1. 將此模板路徑添加到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',
                ],
            },
        },
    ]
    
  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. 加載你的頁面,你應該看到更改


我同意克里斯普拉特。 但我認為最好創建符合管理模板的原始Django文件夾的符號鏈接:

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

你可以看到它取決於python版本和Django安裝的文件夾。 所以在未來或生產服務器上,您可能需要更改路徑。


Chengs的回答是正確的,但根據管理員文檔,並不是每個管理模板都可以這樣覆蓋: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates ://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

對於那些無法以這種方式覆蓋的模板 ,您可能仍然會覆蓋整個項目的模板 。 只需新版本放入您的模板/管理員目錄即可。 這對創建自定義404和500頁特別有用

我不得不覆蓋管理員的login.html,因此必須將覆蓋的模板放在這個文件夾結構中:

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

(沒有管理員中的myapp子文件夾)我沒有足夠的評論來評論程的帖子,這就是為什麼我不得不把這寫成新的答案。


This網站有一個簡單的解決方案,用我的Django 1.7配置。

FIRST:在項目的模板/目錄中將名為admin_src的符號鏈接添加到已安裝的Django模板中。 對於我使用virtualenv的Dreamhost,我的“源代碼”Django管理模板位於:

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

SECOND:在模板/

所以我的項目的模板/目錄現在看起來像這樣:

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

THIRD:在你的新模板/ 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文件夾中。

完成。 簡單。



更新

閱讀您的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-templates

2011年的原始答案:

大約一年半前,我遇到了同樣的問題,我在djangosnippets.org上找到了一個很好的模板加載器,這使得這很容易。 它允許您在特定的應用程序中擴展模板,使您可以創建自己的admin / index.html ,從admin應用程序擴展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管理模板放入您的項目中。 所以你的模板將在templates/admin而股票Django的管理模板將在說template/django_admin 。 然後,你可以做如下的事情:

模板/管理/ change_form.html

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

Your stuff here

如果您擔心讓庫存模板保持最新狀態,可以使用svn externals或類似軟件包括它們。


如果您需要覆蓋admin/index.html ,則可以設置index_template參數。

例如

# 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


確保您的Procfile沒有擴展名。

要在Windows上創建沒有擴展名的文件,可以使用命令notepad Procfile. 從命令行。





python django django-admin