- एक सरल
__init__()
ओवरराइड के साथ अपना स्वयं का AdminSite बनाएं।
- व्यवस्थापक
urls.py
में व्यवस्थापक आयात करें।
Django व्यवस्थापक को बदलने और कम से कम प्रयास के साथ autodiscover()
व्यवहार प्राप्त करना संभव है।
project/
manage.py
project/
__init__.py
settings.py
urls.py
wsgi.py
admin.py # CREATE THIS FILE
परियोजना/admin.py: (। मुझे लगता है कि यह सबसे अधिक समझ में आता है परियोजना स्तर पर यह करने के लिए)
from django.contrib.admin import * # PART 1
class MyAdminSite(AdminSite):
site_header = "My Site"
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry) # PART 2
site = MyAdminSite()
यहाँ एक परियोजना संरचना ठेठ django-admin startproject project
फैशन में उत्पन्न है परियोजना/urls.py (स्निपेट):
from . import admin # PART 3
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
भाग 1 सरल अजगर है। अपने नामस्थान में django.contrib.admin
से सबकुछ आयात करके, यह ड्रॉप-इन प्रतिस्थापन के रूप में कार्य करता है। मुझे लगता है कि आपको ऐसा करने की ज़रूरत नहीं है, लेकिन यह उम्मीदों को संरक्षित रखने में मदद करता है। भाग 3, बस अपने व्यवस्थापक को कनेक्ट करें। भाग 2 असली चाल है।documentation कहता है, autodiscover()
को काम करने के लिए बुलाया जाता है। सभी ऑटोडिस्कवर INSTALLED_APPS
admin.py
नामक फ़ाइल आयात करने का प्रयास कर रहा है। आयात पाठ्यक्रम का कोड चलाता है और वह कोड वही काम कर रहा है जो आप मॉडलों को पंजीकृत करने के लिए करते हैं (उदाहरण decorator और उदाहरण method द्वारा)। कोई जादू नहीं आप को अपने मॉडल को अपने अनुकूलित व्यवस्थापक के साथ पंजीकृत करना है (जैसा कि प्रलेखन कहता है)।
ऑटोडिस्कवर अपने register_to
kwarg के साथ तुलनात्मक रूप से स्मार्ट दिखता है। यह इंगित करता है कि आप अपने स्वयं के व्यवस्थापक को पास करने वाले ऑटोडिस्कवर() को कॉल कर सकते हैं। नहीं; वहां कोई तार नहीं है (भविष्य की सुविधा?)। असाइनमेंट here होता है और मूल एडमिनसाइट उदाहरण here (या here सजावट का उपयोग कर) के लिए तय किया जाता है। Django contrib मॉडल उस उदाहरण के लिए रजिस्टर करते हैं और इसी तरह किसी तीसरे पक्ष के पुस्तकालय भी होंगे। यह ऐसा कुछ नहीं है जिसमें आप हुक कर सकते हैं।
हालांकि यह चाल है, _registry
सिर्फ एक शब्दकोश मैपिंग है। Django को सभी चीजों को स्वतः खोजने दें और फिर मैपिंग कॉपी करें। यही कारण है कि self._registry.update(site._registry)
काम करता है। "स्वयं" आपका कस्टमाइज़ किया गया AdminSite उदाहरण है, "साइट" Django का उदाहरण है और आप अपने मॉडल को या तो पंजीकृत कर सकते हैं।
(अंतिम नोट:।। मॉडल याद कर रहे हैं, तो वे आयात आदेश की वजह से Django के AdminSite करने के लिए सभी पंजीकरण होने के लिए इससे पहले कि आप _registry
कॉपी की जरूरत है अपने अनुकूलित व्यवस्थापक करने के लिए सीधे पंजीयन शायद सबसे आसान बात है।)
का उपयोग करके मेरे लिए काम करता है मैंने अभी Django 1.11 के साथ यह कोशिश की है एक कस्टम AdminSite उदाहरण के साथ। पंजीकृत मॉडल माता-पिता AdminSite से सभी डिफ़ॉल्ट लेते हैं, न कि बच्चे के उदाहरण के प्रासंगिक डिफ़ॉल्ट। उदाहरण के लिए साइट_टाइटल मेरे कस्टम इंस्टेंस में एक अलग मूल्य पर सेट है और ऑटो पंजीकृत होने वाले किसी भी मॉडल को देखते समय Django डिफ़ॉल्ट केवल उन मॉडलों के लिए दृश्यमान होते हैं। दस्तावेज़ कहते हैं कि कस्टम उदाहरण का उपयोग करते समय आपको मैन्युअल रूप से पंजीकरण करने की उम्मीद है। https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.autodiscover –
क्या आपने 'self._registry.update() 'चरण का प्रयास किया जहां Django ऑटो- पंजीकृत/अपनी AdminSite बनाया और फिर आप मानचित्रण की प्रतिलिपि बनाते हैं? यह मौजूदा मानों को ओवरराइट कर सकता है, इसलिए '__init __() 'में उस कॉल के बाद अपने AdminSite विशेषताओं (जैसे site_title, header, url, आदि) को सेट करने का प्रयास करें। – JCotton
हां मैंने आपके द्वारा पोस्ट की गई सभी कोशिश की। तो अगर मैं इसे सही ढंग से समझता हूं तो आप चाहते हैं कि मैं self__registry_update के बाद __init__ फ़ंक्शन में साइट_हेडर आदि को फिर से परिभाषित करूँ? –