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





4 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. 加載你的頁面,你應該看到更改

python django django-admin

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

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

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

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

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




django 1.5(至少)你可以定義你想用於特定模板的模板

請參閱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 ://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文件夾中。

完成。 簡單。




Related