2009-06-30 12 views
5

मैं django व्यवस्थापक को बेहतर समझने की कोशिश कर रहा हूं और साथ ही, मैं वर्तमान उपयोगकर्ता व्यवस्थापक में एक और फ़ील्ड जोड़ने की कोशिश कर रहा हूं। models.py में मैंdjango व्यवस्थापक के लिए, मैं उपयोगकर्ता मॉडल में कोई फ़ील्ड कैसे जोड़ूं और इसे व्यवस्थापक में संपादन योग्य कर सकता हूं?

User.add_to_class('new_field', models.BooleanField(default=False)) 

किया है और admin.py में मैं निम्नलिखित मिल गया है

class AdjUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('new_field',) 
    list_filter = UserAdmin.list_filter + ('new_field',) 

    fieldsets = UserAdmin.fieldsets 
    fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field') 

(fieldsets मूल रूप से सिर्फ Django/योगदान/प्रमाणन/admin.py से नकल के साथ) समस्या है, जब मैं यह कर मैं त्रुटि मिलती है:

AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.

मैं UserChangeForm को देखा है, लेकिन ऐसा लगता है कि यह एक है मॉडल के रूप में उपयोगकर्ता में पहले से ही खींच रहा है। मुझे यकीन नहीं है कि new_field फ़ॉर्म से क्यों गुम है।

धन्यवाद

इस किया जा रहा बदबूदार कोड के संबंध में

मैं जानता हूँ कि यह एक बदबूदार बंदर पैचिंग तरीका यह करने के बारे में जाने के लिए है, लेकिन उपवर्गीकरण मुझे these कारणों के लिए मुख्य रूप से जारी करता है देता है .. अगर मैं इसे ऊपर बताए तरीके से काम करने के लिए मिल सकता है, मैं खुश रहूंगा .. और शायद सुगंधित।

सुझाया गया तरीका

मैं एक उपयोगकर्ता प्रोफ़ाइल बनाने की सिफारिश की जिस तरह के बारे में पता कर रहा हूँ के संबंध में, सिर्फ इतना है कि विशेष परिस्थितियों में, मैं योग्यता एक पूरी नई तालिका बनाने में नहीं दिख रहा है और जब मैं स्टोर करना चाहता हूं तो डेटाबेस में अतिरिक्त कॉल करना is_private या कुछ ऐसे जैसे जानकारी का एक अतिरिक्त हिस्सा है। यदि मैं बहुत अधिक जानकारी संग्रहीत कर रहा हूं, तो मैं सहमत हूं कि उपयोगकर्ता प्रोफ़ाइल सेट करना बेहतर है।

उत्तर

12

सबसे पहले "क्या यह प्लग इन है?" प्रश्न - क्या आपने डेटाबेस में उपयोगकर्ता तालिका में मैन्युअल रूप से new_field जोड़ा है? सिंकडब ने निश्चित रूप से इसका ख्याल नहीं रखा होगा।

उसके बाद, मैं शुरू से यह पुनर्निर्माण के बजाय मौजूदा UserAdmin पर खेतों जोड़कर कोशिश करेंगे:

from django.contrib.auth.admin import UserAdmin 

UserAdmin.list_display += ('new_field',) # don't forget the commas 
UserAdmin.list_filter += ('new_field',) 
UserAdmin.fieldsets += ('new_field',) 
+1

हम्म .. पता नहीं क्यों मैं फ्लॉप वें list_display = UserAdmin.list_display + ('new_field',) का उपयोग करने के बाद उसमें स्याही .. धन्यवाद! – Silfheed

+2

जब मैं का उपयोग करें: UserAdmin.list_display + = ('उपनाम',) UserAdmin.list_filter + = ('उपनाम',) UserAdmin.fieldsets + = ('उपनाम',) <-----> वहाँ कुछ गलत है, की तरह यह: : (admin.E008) 'फ़ील्ड्स [4]' का मान एक सूची या टुपल होना चाहिए। <-----> और मैं चांग के लिए: UserAdmin.list_display + = ('उपनाम',) UserAdmin.list_filter + = ('उपनाम',) UserAdmin.fieldsets + = (('उपनाम', { 'क्षेत्रों': ('उपनाम',)}), <-----> यह समस्या समाप्त हो गई है। – bovenson

4

यह अपने खुद के उपयोगकर्ता प्रोफ़ाइल वर्ग लिखने के लिए पसंद किया जाता है, और उपयोगकर्ता मॉडल में संलग्न करें। फिर आप उपयोगकर्ता से प्रोफ़ाइल पुनर्प्राप्त करने के लिए get_profile() विधि का उपयोग कर सकते हैं।

एक इनलाइन व्यवस्थापक से प्रोफ़ाइल व्यवस्थापक को उप-वर्गीकरण करने से आपको उपयोगकर्ता के पृष्ठ पर प्रोफ़ाइल संपादित करने की अनुमति मिलनी चाहिए, जो लगभग आप जो करने की कोशिश कर रहे हैं।

इस पोस्ट में इस मुद्दे पर एक बहुत अच्छी लेख है: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

0

मैं 'उस रूप में नहीं है जिसकी' त्रुटि मिली, और कहा कि यह मेरे खेत की वजह से 'के रूप में संपादित चिह्नित किया जा रहा था = मॉडल में झूठा '।

2

आपके डीबी के बावजूद उपयोगकर्ता प्रोफाइल होने के लिए चिंताओं को देखते हुए, यह वास्तव में आपको इस समस्या के लिए जाना चाहिए।

  1. उपयोगकर्ता मॉडल की बहुत कसकर Django के प्रमाणीकरण प्रणाली के लिए और कई अन्य प्लग-इन के लिए युग्मित है: इस के लिए दो मुख्य कारण हैं। यह बंदर बंदर एक अच्छा विचार नहीं है।

  2. Django उपयोगकर्ता प्रोफ़ाइल बनाने के लिए अंतर्निहित समर्थन है और कई एक्सटेंशन जानते हैं कि इनके साथ अच्छी तरह से कैसे खेलना है। उपयोगकर्ता प्रोफाइल का उपयोग करके (इस पर मुख्य चर्चा के लिए http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users देखें) आप इससे लाभ उठा सकते हैं।

आप उपयोगकर्ताओं के लिए व्यवस्थापक इंटरफ़ेस में कार्यक्षमता जोड़ने के लिए देख रहे हैं, तो इस नोट से सहायता मिलेगी:

http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html

सादर,

इयान

2

बस यह पता लगाया, शायद यह भी आपकी मदद कर सकता है।

के बाद आपको लगता है कि आप एक अलग प्रोफ़ाइल है, तो आप बस मौजूदा उपयोगकर्ता व्यवस्थापक के लिए एक स्तंभ जोड़ना चाहते हैं का उल्लेख नहीं है, तो आप admin.py में निम्न कर सकते हैं:

सबसे पहले आप एक कस्टम व्यवस्थापक बनाने उपवर्गीकरण UserAdmin:

class CustomUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('is_complete',) 

    def is_complete(self, obj): 
     # Example here, you can use any expression. 
     return SomeOtherClass.objects.get(my_field=obj).is_complete() 

    # Not required, but this gives you a nice boolean field: 
    is_complete.boolean = True 

तो मौजूदा UserAdmin अपंजीकृत करें और रजिस्टर अपनी खुद की:

admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 
संबंधित मुद्दे