बुनियादी Django व्यवस्थापक टेम्पलेट्स को ओवरराइड और विस्तारित कैसे करें?


126

एक व्यवस्थापक टेम्पलेट (उदाहरण के लिए व्यवस्थापक / index.html) को ओवरराइड करते समय कैसे करते हैं (इसे https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-recacing देखें) -न-एडमिन-टेम्प्लेट )?

पहला - मुझे पता है कि यह प्रश्न पहले पूछा गया है और इसका उत्तर दिया गया है (देखें Django: ओवरराइडिंग और ऐप टेम्पलेट का विस्तार ) समय)।

मेरा वर्तमान वर्कअराउंड कॉपी करना और एडमिन टेम्प्लेट से सीधे विस्तार करने के बजाय उनसे विस्तार करना है। यह बहुत अच्छा काम करता है, लेकिन यह वास्तव में भ्रामक है और अतिरिक्त काम जोड़ता है जब व्यवस्थापक टेम्पलेट बदलता है।

यह टेम्प्लेट के लिए कुछ कस्टम एक्सटेंशन-टैग के बारे में सोच सकता है, लेकिन मैं पहले से ही एक समाधान मौजूद होने पर पहिया को सुदृढ़ नहीं करना चाहता।

एक साइड नोट पर: क्या कोई जानता है कि क्या इस समस्या का समाधान खुद Django द्वारा किया जाएगा?


1
व्यवस्थापक टेम्प्लेट को कॉपी करना, उन्हें विस्तारित करना और ब्लॉकों को ओवरराइड करना / जोड़ना सबसे कुशल है, हालांकि जिओ की वर्तमान स्थिति को देखते हुए इष्टतम वर्कफ़्लो नहीं। मैंने इसके साथ काम करने के तीन साल में जो करने की कोशिश की है, उसे करने का कोई और तरीका नहीं देखा है :)
ब्रैंडन

ठीक है - मुझे नहीं पता कि यह अच्छी बात है या नहीं लेकिन कम से कम आप जैसे लोग तो इसी निष्कर्ष पर पहुंचे हैं। सुनकर अच्छा लगा। :)
सेमल

जवाबों:


101

अपडेट :

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 पर एक अच्छा टेम्पलेट लोडर मिला, जो इसे बहुत आसान बनाता है। यह आपको एक विशिष्ट ऐप में एक टेम्प्लेट का विस्तार करने की अनुमति देता है, जिससे आपको अपना स्वयं का व्यवस्थापक / index.html बनाने की क्षमता मिलती है जो व्यवस्थापक ऐप से व्यवस्थापक / 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 %}

मैंने अपनी वेबसाइट पर एक ब्लॉग पोस्ट में इस टेम्पलेट लोडर का उपयोग करने के तरीके पर एक पूर्ण उदाहरण दिया है ।


18
सन्दर्भ के लिए; विचाराधीन स्निपेट को django ऐप में बदल दिया गया है, और PyPi (पाइप / easy_install) में django-apptemplates: pypi.python.org/pypi/django-apptemplates
Romløk

9
बस 100% स्पष्ट होने के लिए: उपरोक्त समाधान Django के हाल के संस्करणों के लिए कोई कम से कम काम करेगा (कम से कम 1.4), स्क्रिप्ट के उपयोग में से एक के रूप में मूल्यह्रास किया जाता है। आप अद्यतन स्रोत यहां
OldTinfoil

2
ध्यान दें कि Django 1.8 के साथ यह अभी भी काम करेगा, लेकिन सेटअप को एक विशेष तरीके से बनाने की आवश्यकता है ( एक उदाहरण के रूप में app_namespace.Loader सेटअप देखें )। अगर यह एक दिन काम करना बंद कर दे तो django-app-namespace-template-loader भी एक कामकाजी विकल्प django-apptemplatesहै।
पीटरिनो

यह जवाब पुराने Django संस्करणों के लिए बहुत अच्छा था। लेकिन अभी तक, चेंग द्वारा एक और जवाब अधिक प्रासंगिक है। stackoverflow.com/a/29997719/7344164
SoftwareEnggUmar

70

Django 1.8 के रूप में वर्तमान रिलीज़ होने के लिए, आपके प्रोजेक्ट फ़ोल्डर में व्यवस्थापक / टेम्प्लेट की प्रतिलिपि बनाने, या ऊपर दिए गए उत्तरों के अनुसार सुझाव के अनुसार बिचौलियों को स्थापित करने की आवश्यकता नहीं है। यहाँ क्या करना है:

  1. निम्नलिखित पेड़ संरचना बनाएं ( आधिकारिक दस्तावेज द्वारा अनुशंसित )

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

नोट : इस फ़ाइल का स्थान महत्वपूर्ण नहीं है। आप इसे अपने ऐप के अंदर रख सकते हैं और यह अभी भी काम करेगा। जब तक django द्वारा इसके स्थान को खोजा जा सकता है। क्या अधिक महत्वपूर्ण है HTML फ़ाइल का नाम मूल HTML फ़ाइल के नाम के समान है जो django द्वारा प्रदान किया गया है।

  1. इस टेम्पलेट पथ को अपनी सेटिंग में जोड़ें :

    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 के व्यवस्थापक / टेम्प्लेट निर्देशिका को देखकर किया जाता है। मैं virtualenv का उपयोग कर रहा हूँ, इसलिए मेरे लिए, यहाँ रास्ता है:

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

इस उदाहरण में, मैं नए उपयोगकर्ता प्रपत्र को संशोधित करना चाहता हूं। इस दृश्य के लिए टेम्पलेट ज़िम्मेदार change_form.html है । Change_form.html खोलें और उस {% ब्लॉक%} को ढूंढें जिसे आप विस्तारित करना चाहते हैं।

  1. में अपने change_form.html , लिखने somethings यह पसंद:

    {% extends "admin/change_form.html" %}
    {% block field_sets %}
         {# your modification here #}
    {% endblock %}
  2. अपने पृष्ठ को लोड करें और आपको परिवर्तन देखना चाहिए


सभी ब्लॉकों को कॉपी किए बिना मुख्य "index.html" टेम्पलेट को विस्तारित करने के लिए यह अभी भी पर्याप्त नहीं है। एक समाधान कुछ ../"पूर्व निर्धारित" पथ को लिखना है और मूल पथ को अधिक अद्वितीय निर्दिष्ट करना है {% extends "../../admin/templates/admin/index.html" %}उत्तर के लिए लिंक
hynekcer

1
मुझे लगता है कि मंदिरों में हमें 'डीआईआरएस' का उपयोग करना चाहिए: [os.path.join (BASE_DIR, 'टेम्प्लेट')],
Raul Reyes

यह थ्रेड का प्रकार है जो एसओ में दोष को पूरी तरह दिखाता है। एक ढांचा अपडेट हो जाता है और यह सवाल अब प्रासंगिक नहीं है, यह वास्तव में उचित पथ से एक बाधा है। शानदार जवाब यहाँ। आरटीएफएम बच्चे।
डेरेक अडैर

इस उत्तर के लिए धन्यवाद। "इस फ़ाइल का स्थान महत्वपूर्ण नहीं है" को छोड़कर, सब कुछ बहुत अच्छा काम किया।
जसवंथ मणिगुंडन

54

यदि आप को अधिलेखित करने की आवश्यकता है 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


5
प्रतिभाशाली! ऐसा करने से आप फिर {% extends "admin/index.html" %}my_custom_index.html से कर सकते हैं और उस संदर्भ को कॉपी किए बिना django व्यवस्थापक टेम्पलेट का उपयोग कर सकते हैं। धन्यवाद।
मटका 3

3
@Semmel को इसे सही उत्तर के रूप में चिह्नित करना चाहिए, क्योंकि यह सबसे सरल दृष्टिकोण है जो अंतर्निहित django सुविधाओं का उपयोग करता है और कस्टम टेम्पलेट लोडर का उपयोग करने की आवश्यकता नहीं होती है।
MrColes

17

साथ django1.5 (कम से कम) आप यदि आप किसी विशेष के लिए उपयोग करना चाहते हैं टेम्पलेट परिभाषित कर सकते हैंmodeladmin

देख 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(या यदि आप इसे स्क्रैच से करना चाहते हैं)


9

चेंग का जवाब सही है, एडमिन के अनुसार हॉवेर हर एडमिन टेम्पलेट को इस तरह से नहीं लिख सकता है: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding/admin-templates

टेम्प्लेट जिन्हें प्रति ऐप या मॉडल से ओवरराइड किया जा सकता है

कॉन्ट्रीब्यूशन / एडमिन / टेम्प्लेट / एडमिन के हर टेम्पलेट को प्रति ऐप या प्रति मॉडल ओवरराइड नहीं किया जा सकता है। निम्नलिखित कर सकते हैं:

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 सबफ़ोल्डर के बिना) चेंग के पोस्ट पर टिप्पणी करने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है यही कारण है कि मुझे इसे नए उत्तर के रूप में लिखना पड़ा।


प्रतिक्रिया hyneker के लिए धन्यवाद मुझे आशा है कि मेरा उत्तर स्पष्ट और अब सीधे बिंदु पर है।
matyas

हां, यह जानना उपयोगी है कि परियोजना स्तर पर टेम्प्लेट्स को अनुकूलित किया जा सकता है, भले ही उनमें से कुछ को आवेदन स्तर पर वैकल्पिक रूप से बदला जा सके।
hynekcer

5

इसका सबसे अच्छा तरीका है कि आप अपने प्रोजेक्ट के अंदर Django एडमिन टेम्प्लेट डालें। तो आपके टेम्पलेट उस templates/adminसमय में होंगे जब स्टॉक Django व्यवस्थापक टेम्पलेट कहने में होगा template/django_admin। फिर, आप निम्न की तरह कुछ कर सकते हैं:

टेम्पलेट्स / व्यवस्थापक / change_form.html

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

Your stuff here

यदि आप स्टॉक टेम्प्लेट्स को अद्यतित रखने के बारे में चिंतित हैं, तो आप उन्हें svn बाहरी या समान के साथ शामिल कर सकते हैं।


Svn बाहरी का उपयोग करना एक महान विचार है। इससे जो समस्या पेश आती है वह यह है कि मेरे सभी अनुवादक उन सभी टेम्प्लेटों का अनुवाद करने जा रहे हैं (क्योंकि makemessages सभी एडमिन टेम्प्लेट से अनुवाद स्ट्रिंग्स को इकट्ठा करेगा) जो कि यदि आप कई भाषाओं के साथ काम कर रहे हैं तो बहुत अतिरिक्त काम करता है। हो सकता है कि उन टेम्प्लेट को makemessages से बाहर करने का कोई तरीका है?
सेमेल

के --ignoreसाथ तर्क का उपयोग करें makemessages। देखें: docs.djangoproject.com/en/dev/ref/django-admin/#makemessages
क्रिस प्रैट

मुझे लगता है कि अन्य उत्तर मेरी जरूरत को बेहतर तरीके से फिट करता है। लेकिन मुझे आपका समाधान पसंद है और लगता है कि यह एक अच्छा विकल्प है यदि आप अपने टेम्पलेट लोडर के साथ गड़बड़ नहीं करना चाहते हैं।
सेमेल

5

मुझे आधिकारिक 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/

यहाँ आपको क्या करना है:

  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_siteकरने के लिए admin.CustomAdminSiteपिछले चरण से:

    from django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
  3. में mysite/settings.py, की जगह django.admin.siteमें INSTALLED_APPSसाथ apps.CustomAdminConfig(पिछले चरण से अपने कस्टम व्यवस्थापक ऐप्स config)।

  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.htmltemplates/admin/index.html

    मौजूदा सभी टेम्प्लेट इस तरह से संशोधित किए जा सकते हैं, और उनके नाम और संरचनाएं Django के स्रोत कोड में पाई जा सकती हैं

  6. अब आप या तो टेम्पलेट को स्क्रैच से लिखकर ओवरराइड कर सकते हैं या इसे बढ़ा सकते हैं और फिर विशिष्ट ब्लॉकों को ओवरराइड / विस्तारित कर सकते हैं।

    उदाहरण के लिए, यदि आप सबकुछ अपने पास रखना चाहते हैं, लेकिन 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ब्लॉक को संशोधित करके कस्टम शैली और स्क्रिप्ट भी जोड़ सकते हैं ।


क्या आपके पास इस बारे में कोई स्रोत या दस्तावेज है?
मैरी

बिंदु 5 में मैंने जो दो संदर्भ जोड़े हैं, उनके अलावा, मेरे पास और कुछ नहीं है।
फहील

1

मैं क्रिस प्रैट से सहमत हूं। लेकिन मुझे लगता है कि मूल Django फोल्डर में सिम्पींक बनाना बेहतर होता है, जहाँ एडमिन टेम्पलेट लगाता है:

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

और जैसा कि आप देख सकते हैं कि यह अजगर संस्करण और Django स्थापित फ़ोल्डर पर निर्भर करता है। इसलिए भविष्य में या उत्पादन सर्वर पर आपको पथ बदलने की आवश्यकता हो सकती है।


0

इस साइट पर एक सरल समाधान था जो मेरे Django 1.7 कॉन्फ़िगरेशन के साथ काम करता था।

FIRST: अपने प्रोजेक्ट के टेम्प्लेट / डायरेक्टरी में अपने इंस्टॉल किए गए Django टेम्प्लेट में admin_src नाम का एक सिमलिंक बनाएं । मेरे लिए ड्रीमहॉस्ट एक virtualenv का उपयोग करके, मेरे "स्रोत" 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...

तृतीय: अपने नए टेम्प्लेट / व्यवस्थापक / निर्देशिका में इस सामग्री के साथ एक बेस। Html फ़ाइल बनाएँ :

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

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

चरण : अपने व्यवस्थापक favicon-admin.ico को अपने स्थिर रूट img फ़ोल्डर में जोड़ें।

किया हुआ। आसान।


0

ऐप इंडेक्स के लिए इस लाइन को url.py की तरह कहीं सामान्य पाई फ़ाइल में जोड़ें

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

एप्लिकेशन मॉड्यूल इंडेक्स के लिए: इस लाइन को admin.py जोड़ें

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

परिवर्तन सूची के लिए: इस लाइन को व्यवस्थापक वर्ग में जोड़ें:

change_list_template = "servers/servers_changelist.html"

ऐप मॉड्यूल फॉर्म टेम्पलेट के लिए: इस लाइन को अपने व्यवस्थापक वर्ग में जोड़ें

change_form_template = "servers/server_changeform.html"

आदि और एक ही व्यवस्थापक मॉड्यूल वर्गों में अन्य पाते हैं


-1

आप django-overextends का उपयोग कर सकते हैं , जो Django के लिए परिपत्र टेम्पलेट विरासत प्रदान करता है।

यह मेजेनाइन सीएमएस से आता है , जहां से स्टीफन ने इसे स्टैंडअलोन Django एक्सटेंशन में निकाला था।

अधिक इन्फोस आपको "मेज़ानाइन डॉक्स के अंदर" ओवरराइडिंग बनाम एक्सटेंडिंग टेम्प्लेट "(http: /mezzanine.jupo.org/docs/content-Healthecture.html#overriding-vs-extending-templates) में मिलता है।

गहरी जानकारी के लिए स्टीफ़ेंस ब्लॉग "जिरांगो के लिए सर्कुलर टेम्प्लेट इनहेरिटेंस" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django) देखें।

और Google समूहों में चर्चा (https: /groups.google.com/forum / #! विषय / mezzanine-users / sUydcf_IZkQ) जिसने इस सुविधा का विकास शुरू किया।

ध्यान दें:

मेरे पास 2 से अधिक लिंक जोड़ने की प्रतिष्ठा नहीं है। लेकिन मुझे लगता है कि लिंक दिलचस्प पृष्ठभूमि जानकारी प्रदान करते हैं। इसलिए मैंने "http (s):" के बाद बस एक स्लैश छोड़ दिया। हो सकता है कि बेहतर प्रतिष्ठा वाला कोई व्यक्ति लिंक की मरम्मत कर सकता है और इस नोट को हटा सकता है।


Django 1.9 के बाद से, यह परियोजना प्रासंगिक नहीं है, अनुचर अभी इसका विज्ञापन नहीं कर रहा है, कोड . djangoproject.com/ticket/15053 और github.com/stephenmcd/django-overextends/pull/37 देखें । किस ऐप से पूरा टेम्प्लेट लोड किया जाता है, इसका पूरा नियंत्रण लेने के लिए django-apptemplates और django-app-namespace-template-loader हैं, जो दोनों अभी भी प्रासंगिक हैं यदि आप एक ऐप से दूसरे ऐप तक विस्तार करना चाहते हैं।
बेन्जोमिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.