Django में ओवरराइडिंग प्रशासन सीएसएस


84

मैं आधार django जैसे base.css में कुछ सीएसएस बदलना चाहता हूं। क्या django लाइब्रेरी में सीधे बदलाव करना बेहतर है? मैं इसे सबसे अच्छे तरीके से कैसे ओवरराइड कर सकता हूं?


शायद grappelli आपको परेशान ... बचत होगी grappelliproject.com पुराने और पुराना हो चुका ... lincolnloop.com/blog/...
जॉन मी

जवाबों:


111

यह बहुत कुछ निर्भर करता है कि आप क्या करना चाहते हैं। हालांकि सबसे पहले: सीधे Django व्यवस्थापक में इसे अधिलेखित न करें। आपको दो विकल्प मिले जो मुझे उचित लगे:

  1. यदि आप सामान्य रूप से व्यवस्थापक की उपस्थिति को बदलना चाहते हैं, तो आपको व्यवस्थापक टेम्पलेट्स को ओवरराइड करना चाहिए। यह विवरण में शामिल किया गया है: ओवरराइडिंग व्यवस्थापक टेम्प्लेट । कभी-कभी आप केवल मूल व्यवस्थापक फ़ाइल का विस्तार कर सकते हैं और फिर उदाहरण के रूप {% block extrastyle %}{% endblock %}में एक ब्लॉक को अधिलेखित कर सकते हैं django/contrib/admin/templates/admin/base.html
  2. यदि आपकी शैली विशिष्ट है, तो आप Mediaअपने में मेटा क्लास के माध्यम से अतिरिक्त शैलियाँ जोड़ सकते हैं admin.py। एक उदाहरण यहाँ देखें:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }

दरअसल, यह मॉडल स्तर नहीं बल्कि पूरी साइट है। Base.css, अर्थात .css आदि में विशिष्ट परिवर्तन करने के लिए एक विकल्प यह है कि मैं अपने आवेदन में admin / base.html को शामिल करूँ और admin / base.html फ़ाइल में मेरे कस्टम base.css का उपयोग करूँ। इस तरह मुझे django के कुछ टेम्पलेट फ़ाइलों को अपनी साइट पर शामिल करना होगा। क्या इससे बेहतर कोई उपाय है?
राजन stppit 9'11

किसी को भी मेरी जानकारी नहीं है। Django एडमिन एक django reusable ऐप के अलावा और कुछ नहीं है। यही कारण है कि किसी भी अन्य पुन: प्रयोज्य अनुप्रयोग के साथ जाने के लिए है।
टॉरस्टेन एन्गेलब्रैच

मैंने देखा कि यहाँ js के भीतर सूचीबद्ध .css फ़ाइल है ... जो वास्तव में काम करती है? मैं इसे प्राप्त नहीं कर सकता।
फास्टमूलिपिलेशन

हाँ आप सही है। मैंने एक गलती की और django डॉक्स से एक उदाहरण के साथ अपना उत्तर संपादित किया।
टॉरस्टेन एंगेलब्रैच

एली पोर्टर के शब्दों में, "आपने सबसे अच्छी बिल्ली को ग्रिल किया"।
रॉब क्वासोस्की

33
  • में settings.py, सुनिश्चित करें कि आपके एप्लिकेशन को व्यवस्थापन से पहले सूचीबद्ध किया गया है INSTALLED_APPS
  • बनाएँ (your-app)/templates/admin/base_site.htmlऔर <style>ब्लॉक में डाल दिया{% block extrahead %}

उदाहरण:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}

6
सबसे बढ़िया उत्तर। यदि आप चाहते हैं कि आप आधार परियोजना में एक "टेम्पलेट" निर्देशिका डालकर और सेटिंग्स में इसे रेफर करने के लिए INSTALLED_APPS में व्यवस्थापक से पहले अपने ऐप को सूचीबद्ध करने से बच सकते हैं: सेटिंग्स में: मंदिर = [... अन्य सामान ..., 'डीआईआरएस': [ os.path.join (BASE_DIR, 'टेम्प्लेट')]]]]
RedPelle

महान विचार! एक आकर्षण की तरह आसानी से काम करता है!
ozw1z5rd 15

29

मैंने अपनी स्वयं की सीएसएस फ़ाइल के लिए एक संदर्भ शामिल करने के लिए अभी-अभी व्यवस्थापक / base.html बढ़ाया है - अंत में। सीएसएस की सुंदरता यह है कि आपको मौजूदा परिभाषाओं को छूने की जरूरत नहीं है, बस फिर से परिभाषित करें।


28

यह समाधान व्यवस्थापक साइट के लिए काम करेगा, मुझे लगता है कि यह सबसे साफ तरीका है क्योंकि यह ओवरराइड base_site.htmlकरता है जो django को अपग्रेड करते समय नहीं बदलता है।

अपने टेम्प्लेट डायरेक्टरी में बनाएं एक फोल्डर, जिसमें adminएक फाइल होती है, जिसका नाम एक फाइल होता है base_site.html

cssनामक फ़ाइल के अंतर्गत अपनी स्थिर निर्देशिका बनाएँ admin-extra.css

उस में लिखें आप की तरह अपने रूपों के लिए चाहते हैं सभी कस्टम सीएसएस: body{background: #000;}

इसमें चिपकाएँ base_site.html:

{% extends "admin/base.html" %}
{% load static from staticfiles %} # This might be just {% load static %} in your ENV

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "css/admin-extra.css" %}" />{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

जैसा कि टिप्पणियों में उल्लेख किया गया है: सुनिश्चित करें कि आपका ऐप INSTALLED_APPS में व्यवस्थापक ऐप से पहले है, अन्यथा आपका टेम्पलेट kango के ओवरराइड नहीं करता है

बस! हो गया


4
धन्यवाद, महान काम करता है! यदि यह काम नहीं करता है, तो सुनिश्चित करें कि आपका ऐप एडमिन ऐप से पहले है INSTALLED_APPS, अन्यथा आपका टेम्पलेट django के ओवरराइड नहीं करता है।
डिबारियो

1
सबसे अच्छा जवाब और टिप्पणी। व्यवस्थापक पृष्ठ पर रंग बदलना आश्चर्यजनक रूप से कठिन है। इस उत्तर और टिप्पणी के माध्यम से जाने से यह निश्चित हो गया कि यह कैसे काम करता है।
डैनियल बटलर

1
आप कैसे जानते हैं कि base_site.htmldjango को अपग्रेड करते समय कभी नहीं बदलेगा? (मेरा मतलब है कि यह उत्तर 3 साल पुराना है और अभी भी काम करता है लेकिन यह कोई गारंटी नहीं है)
Marv

@ उमर यदि आप सोर्स कोड में हुड के नीचे देखते हैं तो आप बहुत आसानी से देख सकते हैं कि एडमिन आर्किटेक्चर इन विशिष्ट नामों के आसपास बनाया गया है विशेष रूप से यूआरएल और टेम्प्लेट रेंडरिंग में। कक्षाएं जो इनहेरिट करती हैं वे कक्षाएं, जो इनहेरिट करती हैं, इन नामों पर भरोसा करती हैं, जब तक कि Django फ्रेमवर्क का एक बड़ा रीडिज़ाइन नहीं होगा (और तब भी मैं इस बदलाव पर दांव नहीं लगाऊंगा) ओवरराइड करने वाले व्यवस्थापक विचारों और व्यवस्थापक यूआरएल के समग्र बुनियादी सम्मेलन के रूप में बेस टेम्पलेट को ओवरराइड करने के साथ ही अगले 3 साल तक कम से कम django रोडमैप के अनुसार रहेगा।
इलाड सिल्वर

1
तो यह django के बारे में सामान्य ज्ञान है और इसकी पुष्टि करने वाला कोई ठोस स्रोत नहीं है? ऐसा नहीं है कि मुझे आप पर संदेह है, मुझे आश्चर्य है कि कोई कैसे पता लगा सकता है कि यह मामला है।
मार्व

17

अपनी स्थिर निर्देशिका में, एक static/admin/css/base.cssफ़ाइल बनाएँ ।

पहले Django के डिफ़ॉल्ट एडमिन CSS में पेस्ट करें , फिर नीचे अपने कस्टमाइज़ेशन जोड़ें।


8
यदि आप ऐसा करते हैं, तो अपने ऐप को पहले django.contrib.adminकी सूची में रखना सुनिश्चित करें INSTALLED_APPS। यदि आप नहीं करते हैं, तो सामूहिक रूप से व्यवस्थापक base.css सबसे पहले मिलेगा और आपका अनुकूलित संस्करण इसे अधिलेखित नहीं करेगा।
डेव

3
यह एक अच्छा दीर्घकालिक समाधान नहीं है। यह कोड का एक गुच्छा कॉपी / पेस्ट करता है और इसे Django अपग्रेड के रूप में बनाए नहीं रखा जाएगा।
मिलिसनर

Django एडमिन के लिए कोई भी स्टाइल मूल रूप से कोड का एक कांटा है। Django के लिए एक अद्यतन प्रभावी रूप से आपके अनुकूलन को तोड़ सकता है। मेरी सिफारिश है कि अनुकूलन को कम से कम रखें और उन्हें Django के डिफ़ॉल्ट स्टाइल के निचले हिस्से में जोड़ें। तब आप डिफ़ॉल्ट स्टाइल को मैन्युअल रूप से अपडेट कर सकते हैं यदि आप चाहते हैं और जब चाहें।
रयान एलन

@ danny-w-adair का उत्तर बेहतर है; चीजों को "DRY" रखता है, लेकिन यह अभी भी Django के कोड का एक कांटा है जो मामूली अपग्रेड दर्द पैदा कर सकता है।
रयान एलेन

10

यदि आप एक वैश्विक दायरा चाहते हैं और आप टेम्पलेट को ओवरराइड करने के बारे में नहीं सोचना चाहते हैं तो इसके लिए एक मिक्सिन वास्तव में अच्छी तरह से काम करता है। इस कोड को आप जहां चाहें डाल दें:

class CSSAdminMixin(object):
    class Media:
        css = {
            'all': ('css/admin.css',),
        }

फिर, admin.cssउदाहरण के लिए, अपने ओवरराइड्स के साथ सीएसएस फ़ाइल बनायें:

select[multiple] {
    resize: vertical;
}

फिर, आप जो भी मॉडल चाहते हैं, करें:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

और तुम सब सेट हो जाओगे।


मुझे आपका उत्तर पसंद है, लेकिन MyModelAdmin पर सीधे क्यों नहीं जोड़ना है
गोरान

1
आप ऐसा कर सकते हैं यदि यह एक मॉडल है, लेकिन अगर आप इसे कई मॉडलों के लिए करते हैं तो यह गड़बड़ हो जाएगा।
mlissner

4

में admin/css/changelists.cssएक फ़ोल्डर के अंदर है STATICFILES_DIRS, और यह उपयोगकर्ता है कि डिफ़ॉल्ट व्यवस्थापक एक के बजाय changelists.css होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.