11

मैं डिफ़ॉल्ट व्यवस्थापक साइट के साथ Django प्रमाणन का उपयोग कर प्रमाणीकरण प्रबंधन लागू किया लेकिन तब मैं अपने खुद के AdminSite उपयोग करने के लिए कुछ व्यवहार के पुनर्लेखन के लिए चाहता था:ऑटो कस्टम व्यवस्थापक साइट का उपयोग रजिस्टर Django auth मॉडल

class OptiAdmin(admin.AdminSite): 
    site_title = "Optimizer site's admin" 
    #...Other stuff here 

तब मेरे स्वयं के मॉडल पंजीकृत :

admin_site = OptiAdmin(name='opti_admin') 
admin.site.register(MyModel, MyModelAdmin) 
#Other stuff here 

लेकिन मैं केवल जो मेरे लिए उचित लगता है मॉडल मैं सिर्फ पंजीकृत, देखने के लिए कर रहा हूँ जब मैं व्यवस्थापक साइट पर जाने, लेकिन मैं सहित इस नए कस्टम साइट में सभी अन्य एप्लिकेशन मॉडल देखना चाहेंगे लेखक के उपयोगकर्ता और समूह और मैं नहीं करता हूं अब डिफ़ॉल्ट व्यवस्थापक की तरह यह स्वचालित रूप से कैसे करें, कृपया मदद करें :)।

उत्तर

9
  1. एक सरल __init__() ओवरराइड के साथ अपना स्वयं का AdminSite बनाएं।
  2. व्यवस्थापक 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_APPSadmin.py नामक फ़ाइल आयात करने का प्रयास कर रहा है। आयात पाठ्यक्रम का कोड चलाता है और वह कोड वही काम कर रहा है जो आप मॉडलों को पंजीकृत करने के लिए करते हैं (उदाहरण decorator और उदाहरण method द्वारा)। कोई जादू नहीं आप को अपने मॉडल को अपने अनुकूलित व्यवस्थापक के साथ पंजीकृत करना है (जैसा कि प्रलेखन कहता है)।

ऑटोडिस्कवर अपने register_tokwarg के साथ तुलनात्मक रूप से स्मार्ट दिखता है। यह इंगित करता है कि आप अपने स्वयं के व्यवस्थापक को पास करने वाले ऑटोडिस्कवर() को कॉल कर सकते हैं। नहीं; वहां कोई तार नहीं है (भविष्य की सुविधा?)। असाइनमेंट here होता है और मूल एडमिनसाइट उदाहरण here (या here सजावट का उपयोग कर) के लिए तय किया जाता है। Django contrib मॉडल उस उदाहरण के लिए रजिस्टर करते हैं और इसी तरह किसी तीसरे पक्ष के पुस्तकालय भी होंगे। यह ऐसा कुछ नहीं है जिसमें आप हुक कर सकते हैं।

हालांकि यह चाल है, _registry सिर्फ एक शब्दकोश मैपिंग है। Django को सभी चीजों को स्वतः खोजने दें और फिर मैपिंग कॉपी करें। यही कारण है कि self._registry.update(site._registry) काम करता है। "स्वयं" आपका कस्टमाइज़ किया गया AdminSite उदाहरण है, "साइट" Django का उदाहरण है और आप अपने मॉडल को या तो पंजीकृत कर सकते हैं।

(अंतिम नोट:।। मॉडल याद कर रहे हैं, तो वे आयात आदेश की वजह से Django के AdminSite करने के लिए सभी पंजीकरण होने के लिए इससे पहले कि आप _registry कॉपी की जरूरत है अपने अनुकूलित व्यवस्थापक करने के लिए सीधे पंजीयन शायद सबसे आसान बात है।)

+0

का उपयोग करके मेरे लिए काम करता है मैंने अभी Django 1.11 के साथ यह कोशिश की है एक कस्टम AdminSite उदाहरण के साथ। पंजीकृत मॉडल माता-पिता AdminSite से सभी डिफ़ॉल्ट लेते हैं, न कि बच्चे के उदाहरण के प्रासंगिक डिफ़ॉल्ट। उदाहरण के लिए साइट_टाइटल मेरे कस्टम इंस्टेंस में एक अलग मूल्य पर सेट है और ऑटो पंजीकृत होने वाले किसी भी मॉडल को देखते समय Django डिफ़ॉल्ट केवल उन मॉडलों के लिए दृश्यमान होते हैं। दस्तावेज़ कहते हैं कि कस्टम उदाहरण का उपयोग करते समय आपको मैन्युअल रूप से पंजीकरण करने की उम्मीद है। https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.autodiscover –

+0

क्या आपने 'self._registry.update() 'चरण का प्रयास किया जहां Django ऑटो- पंजीकृत/अपनी AdminSite बनाया और फिर आप मानचित्रण की प्रतिलिपि बनाते हैं? यह मौजूदा मानों को ओवरराइट कर सकता है, इसलिए '__init __() 'में उस कॉल के बाद अपने AdminSite विशेषताओं (जैसे site_title, header, url, आदि) को सेट करने का प्रयास करें। – JCotton

+0

हां मैंने आपके द्वारा पोस्ट की गई सभी कोशिश की। तो अगर मैं इसे सही ढंग से समझता हूं तो आप चाहते हैं कि मैं self__registry_update के बाद __init__ फ़ंक्शन में साइट_हेडर आदि को फिर से परिभाषित करूँ? –

6

Django दस्तावेज़ कस्टम व्यवस्थापक साइट के साथ SimpleAdminConfig का उपयोग करने का सुझाव देते हैं।

INSTALLED_APPS = (
    ... 
    'django.contrib.admin.apps.SimpleAdminConfig', 
    ... 
) 

कि मॉडल से बचाता है डिफ़ॉल्ट AdminSite साथ पंजीकृत किया जा रहा।

डॉक्स ग्रहण करने के लिए है कि आप व्यक्तिगत रूप से मॉडल आयात और उन्हें अपने कस्टम व्यवस्थापक साइट के लिए जोड़ देगा लगते हैं:

from django.contrib.auth.models import Group, User 
from django.contrib.auth.admin import GroupAdmin, UserAdmin 

admin_site.register(Group, GroupAdmin) 
admin_site.register(User, UserAdmin) 

यह बहुत दोहराव हो सकता है अगर आप कई क्षुधा में मॉडल की है। यह आपकी सलाह नहीं देता है कि अपने कस्टम ऐप्स के साथ अपने सभी ऐप्स से मॉडलों को स्वचालित रूप से कैसे पंजीकृत करें।

आप बंदर पैचिंग admin, और admin.site को अपने आप से बदलकर कोशिश कर सकते हैं।

from django.contrib import admin 
admin.site = OptiAdmin(name='opti_admin') 

तब, जब कोड admin.site.register() कहा जाता है, यह अपने व्यवस्थापक साइट के साथ मॉडल रजिस्टर होगा। किसी भी मॉडल पंजीकृत होने से पहले इस कोड को चलाने के लिए होगा। आप इसे अपने ऐप के लिए AppConfig में डालने का प्रयास कर सकते हैं, और सुनिश्चित करें कि आपका ऐप django.contrib.admin से ऊपर है।

+0

@ अलास्दीर थक्स, मैं आज बाद में इस बंदर पैचिंग की कोशिश करूंगा, ऐसा लगता है जैसे यह काम कर सकता है। इसके अलावा, मैन्युअल पंजीकरण निश्चित रूप से नौकरी करेगा लेकिन मुझे प्रत्येक ऐप में प्रत्येक मॉडल को पंजीकृत करना होगा जिसमें मैं शामिल होना चाहता हूं – gerosalesc

+0

हां, मैन्युअल रूप से पंजीकरण करना बहुत दोहराया जा सकता है! – Alasdair

+0

यह 'आयात django.contrib.admin' 'django.contrib.admin.sites.site = admin_site' ' django.contrib.admin.site = admin_site' – beruic

संबंधित मुद्दे