2010-07-08 13 views
14

मैं Django प्रोजेक्ट के अंदर 2 अलग-अलग व्यवस्थापक साइट बनाना चाहता हूं।Django प्रोजेक्ट में 2 अलग-अलग व्यवस्थापक साइटें कैसे हैं?

अलग से मेरा मतलब है - उनके पास अलग-अलग उपयोगकर्ता प्रमाणीकरण होना चाहिए, उन्हें अलग-अलग मॉडल का प्रशासन करना चाहिए, और अलग-अलग दिखने और यूआरएल होना चाहिए।

कारण मैं यह करना चाहता हूं कि ग्राहक पृष्ठ के सीएमएस भाग को प्रशासित करने के लिए अलग सेक्शन चाहता है, और 'बैक ऑफिस' समाधान के रूप में उपयोग करने के लिए अलग है।

मैंने अपने प्रोजेक्ट ट्री में सिर्फ एक प्रतिलिपि od django.contrib.auth appliaction बनाने के बारे में सोचा, इसे अलग-अलग नाम दिया और अलग-अलग admin.site.register() दोनों के लिए कॉल का उपयोग किया। इस तरह से मैं उनमें से प्रत्येक में अलग-अलग मॉडल उपलब्ध कर सकता हूं, अलग-अलग दिखता हूं, आदि। मुझे नहीं पता कि उपयोगकर्ता-प्रमाणीकरण समस्या को कैसे हल किया जाए (मेरे पास अलग-अलग उपयोगकर्ता होना चाहिए ताकि सीएमएस में बैकऑफिस में लॉग इन करने में सक्षम हो) ।

कोई भी इससे पहले ऐसा करने के लिए हुआ और मुझे कुछ संकेत दे सकता था? या जो मैं करने की योजना बना रहा हूं वह डिजाइन द्वारा गलत है?

उत्तर

7

अलग AdminSites में मॉडल रजिस्टर करने के लिए आप बस django.contrib.admin.sites.AdminSite के विभिन्न उदाहरण बनाने की आवश्यकता है, see this.

आप विभिन्न मॉडलों के प्रबंधन और विभिन्न टेम्पलेट्स के साथ दो अलग-अलग व्यवस्थापक साइटों के साथ जाने के लिए अच्छा होगा। प्रमाणीकरण और अनुमतियों के लिए आपको कस्टम अनुमतियों के साथ बिल्ड-इन django.contrib.auth का उपयोग करने में सक्षम होना चाहिए (उम्मीद है कि कोई और यहां और अधिक मदद कर पाएगा)

+1

के लिए त्वरित उदाहरण जब मैं इसे करने का प्रयास करता हूं, तो लॉग इन करने के बाद, मुझे "आपको कुछ भी संपादित करने की अनुमति नहीं है।" संदेश ... – kender

+3

आपके द्वारा उपयोग किए जाने वाले उपयोगकर्ता में is_staff होना चाहिए और is_superuser फ़ील्ड सत्य पर सेट होनी चाहिए। फिर विभिन्न व्यवस्थापक उपयोगकर्ताओं के बीच अंतर करने के बाद और उनके पास http://docs.djangoproject.com/en/1.2/topics/auth/#permissions –

+0

देखने के लिए क्या पहुंच है, ठीक है, मुझे यह काम करने के लिए मिला। लेकिन मुझे 2 व्यवस्थापक साइटों के लिए टेम्पलेट्स का एक अलग सेट नहीं दिख रहा है - वे दोनों टेम्पलेट्स में 'व्यवस्थापक /' निर्देशिका देखते हैं, यहां तक ​​कि एक को 'बैकऑफिस' तर्क के साथ बनाया गया है, जिसे अपना नाम 'बैकऑफिस' पर सेट करना चाहिए '... – kender

38

आप उपवर्ग कर सकते हैं Django के AdminSite (यह जैसे admin.py में अपनी परियोजना के जड़ में डाल दिया।):

from django.contrib.admin.sites import AdminSite 

class MyAdminSite(AdminSite): 
    pass 
    #or overwrite some methods for different functionality 

myadmin = MyAdminSite(name="myadmin") 

कम से कम 1.9 आप पर से यह ठीक से काम करने के लिए नाम पैरामीटर जोड़ना। इसका उपयोग रिवर्स यूआरएल बनाने के लिए किया जाता है, इसलिए नाम urls.py से एक होना चाहिए।

तो आप इसे अपने एप्लिकेशन की admin.py उसी तरह से उपयोग कर सकते हैं जैसा कि आप सामान्य AdminSite उदाहरण के साथ कार्य करें:

from myproject.admin import myadmin 
myadmin.register(MyModel_A) 

तुम भी इसके लिए कुछ यूआरएल परिभाषित करने की जरूरत (अपने प्रोजेक्ट की urls.py में):

from myproject.admin import admin, user_site 
from myproject.admin import myadmin 
urlpatterns = patterns('', 
    ... 
    (r'^admin/', include(admin.site.urls)), 
    (r'^myadmin/', include(myadmin.urls)), 

इसके अलावा इस देखें: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adminsite-objects

+0

व्यवस्थापक साइट –

0

मुझे यकीन नहीं है कि मेरी खोज, यहां बताया गया है कि, निविदा के लिए पूरी तरह मददगार होगा क्योंकि, अन्य चीजों के साथ, मुझे नहीं पता कि वह न केवल दो व्यवस्थापक साइटों बल्कि दो डेटाबेस भी बोल रहा था, प्रत्येक के लिए एक। यह मेरी स्थिति है। मुझे उज्ज्वल विचार आया कि मैं अपने ऐप्स में से एक चाहता था, एक नया ऐप, अपने डेटाबेस और अपने व्यवस्थापक पृष्ठों के लिए।

लेकिन मैं बर्नार्ड वल्लंत के AdminSite उप-वर्गीकरण दृष्टिकोण के साथ एक समस्या में भाग गया, हालांकि ऐसा लगता है कि यह रूढ़िवादी और अनिवार्य रूप से सही काम है। मैंने समस्या का समाधान किया।

यहाँ है कि मैं पूरी तरह से आवश्यक हो पाया बर्नहार्ड Vallant के कोड में आधुनिक है:

from django.contrib.admin.sites import AdminSite 
class MyAdminSite(AdminSite): 
    pass 
    #or overwrite some methods for different functionality 
myadmin = MyAdminSite(name='anything') 

हाँ, मैं वास्तव में name = 'कुछ भी' है कि आप जब तक चुनें (मतलब है के रूप में यह नहीं है 'व्यवस्थापक ')।और मैंने इसके साथ अंदर और बाहर टॉगल किया है और यह हर बार कुछ भी-लेकिन-व्यवस्थापक नाम असाइनमेंट के बिना विफल रहता है।

मेरे द्वारा प्राप्त किए गए लक्षण यह थे कि जब मैंने दूसरा डेटाबेस जोड़ा और इसके लिए एक मैडमिन बनाया और फिर myadmin.register (My_ModelA) के साथ मॉडल पंजीकृत किया, और दो व्यवस्थापक ऐप पृष्ठों को देखने के लिए चला गया, एक के लिए मेरा नया ऐप जो दूसरे डेटाबेस और मायाडमिन और मॉडल माईमोडाला का इस्तेमाल करता था ठीक दिखता था, लेकिन मेरे पुराने व्यवस्थापक पृष्ठ ने अपने मॉडल के लिए मृत लिंक दिखाए और जब मैंने ऐप के लिए एक गैर-मृत लिंक पर क्लिक किया (पुराना ऐप जो पुराने का उपयोग करता है डेटाबेस) मुझे इस प्रभाव के लिए 404 कोड मिला कि पृष्ठ मौजूद नहीं था।

इसके अलावा, मैं नहीं जानता कि यह मायने रखता है, लेकिन मैं क्या बर्नहार्ड Vallant परियोजना urlconf में किया था से कुछ अलग किया:

from django.conf.urls import patterns, include, url 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^admin/', include('mynewapp.urls')), 
    url(r'^someword/admin/', include(admin.site.urls)), 
) 

ठीक है, "someword" के लिए अप्रासंगिक है --- वहाँ अंतिम उपयोगकर्ता के संबंध में उपस्थिति और ऐप या प्रोजेक्ट का नाम नहीं। लेकिन संबंधित व्यवस्थापक मेरे पुराने ऐप और पुराने डेटाबेस के लिए एक है। Autodiscover() समावेशन नोट करें। दस्तावेज़ों में कुछ गड़बड़ भाषा है, जिसमें बर्नहार्ड वलंत ने इसके उपयोग के संबंध में लिंक किया था जब प्रोजेक्ट urlconf को कॉन्फ़िगर किया गया है क्योंकि बर्नार्ड वलंत के पास इसे मैडमिन आयात के साथ ही डिफ़ॉल्ट व्यवस्थापक के संदर्भ में भी है।

और mynewapp के लिए urlconf के लिए मेरे पास है:

from django.conf.urls import patterns, url, include 
from myproject.admin import myadmin 

urlpatterns = patterns('', 
    url(r'/', include(myadmin.urls)) 
) 

urlpatterns += patterns('mynewapp.views',"... url() stuff for mynewapp's views"), 
) 

होते हुए भी 'व्यवस्थापक' के अलावा कुछ करने के लिए आंतरिक रूप से अपने AdminSite उदाहरण के नामकरण के बिल्कुल आवश्यकता है, मैं यह है कि जब यह जाज अप करने के लिए समय आ गया जोड़ना होगा mynewapp की admin.py फ़ाइल कुछ व्यवस्थापक के साथ। मॉडल एडमिन सबक्लासिंग, वास्तव में व्यवस्थापक का उपयोग करना आवश्यक था। मॉडेलएडमिन अभिभावक वर्ग के रूप में। myadmin AdminSite के उप-वर्ग के सभी उदाहरण के बाद है। जैसे कि मैं इकट्ठा करता हूं कि यह admin.site के बराबर है, व्यवस्थापक के साथ नहीं।

यह मेरे जैसे एनओयूबी के लिए बहुत भ्रमित है क्योंकि व्यवस्थापक, निचले मामले के साथ, एक उदाहरण की तरह दिखता है, और मैं सबक्लासिंग उदाहरणों से अपरिचित हूं। तो मुझे लगता है कि यह नहीं है।

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