2010-08-03 11 views
19

यदि आप Django में किसी उपयोगकर्ता (django.contrib.auth.models.User) के बारे में अतिरिक्त जानकारी संग्रहीत करना चाहते हैं तो आप "प्रोफ़ाइल" मॉडल में प्लग करने के लिए निफ्टी AUTH_PROFILE_MODULE का उपयोग कर सकते हैं। प्रत्येक उपयोगकर्ता को प्रोफ़ाइल मिलती है। यह सब यहाँ वर्णित है:मैं व्यवस्थापक इंटरफ़ेस में django उपयोगकर्ता प्रोफ़ाइल को कैसे संपादित कर सकता हूं?

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

उत्तर

13

अच्छा, यह पता चला है कि यह एक आसान है, एक बार जब आप जानते हैं कि यह कैसे करना है।

from django.contrib import admin 
from myapp.accounts.models import UserProfile 
from django.contrib.auth.models import User 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 

class AccountsUserAdmin(admin.UserAdmin): 
    inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin that includes a UserProfile 
admin.site.register(User, AccountsUserAdmin) 

उपयोगकर्ताओं के लिए डिफ़ॉल्ट admin.UserAdmin ModelAdmin वर्ग अपंजीकृत है और एक नया एक इनलाइन UserProfile को निर्दिष्ट अपनी जगह में पंजीकृत है: यह मेरा MyApp/लेखा/admin.py है। बस सोचा कि मुझे साझा करना चाहिए।

+1

आप पासवर्ड फॉर्म लिंक कैसे प्रबंधित कर रहे हैं? बस इन परिवर्तनों को तोड़ दिया जाता है क्योंकि उपयोगकर्ता के नाम और पासवर्ड के साथ उपयोगकर्ता के बाद परिवर्तन फ़ॉर्म से देखा जाना था। – JivanAmara

+2

उपर्युक्त लगभग सही है, 'पासवर्ड फॉर्म लिंक' भी सही तरीका है 'admin.ModelAdmin' का उपयोग करके कस्टम' UserAdmin' का विस्तार करना है - कोशिश करें: 'django.contrib.auth.admin आयात करें UserAdmin' फिर 'क्लास UserProfileAdmin (UserAdmin): ' –

+0

यह बहुत पुराना है और शायद पुराना है। संपादन के लिए धन्यवाद! –

29

मैं आंद्रे के समाधान के एक से थोड़ा सुधार हुआ संस्करण propse के रूप में यह/व्यवस्थापक/प्रमाणन/उपयोगकर्ता में सूची दृश्य टूट जाता है /:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 

class UserAdmin(AuthUserAdmin): 
    def add_view(self, *args, **kwargs): 
     self.inlines = [] 
     return super(UserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
     self.inlines = [UserProfileInline] 
     return super(UserAdmin, self).change_view(*args, **kwargs) 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 

:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

class UserProfileInline(admin.StackedInline): 
model = UserProfile 
max_num = 1 
can_delete = False 

class UserAdmin(AuthUserAdmin): 
inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 
+1

'UserProfileInline' को शीर्ष पर कैसे स्थानांतरित करने के बारे में कोई विचार:? –

+0

इस सुविधा को कई बार अनुरोध किया गया है, https://code.djangoproject.com/ticket/4848 सबसे पुराना है। यह अभी तक लागू नहीं हुआ है। –

+0

बहुत बहुत धन्यवाद! –

15

मैं रॉबर्ट के समाधान के लिए एक और सुधार का प्रस्ताव UserAdmin में इस परिवर्तन के बिना, कस्टम UserProfileInline अनुभाग "उपयोगकर्ता जोड़ें" स्क्रीन पर दिखाई देगा, जिसे केवल उपयोगकर्ता नाम और पासवर्ड के लिए पूछना है। और यदि आप सहेजने से पहले उस स्क्रीन पर किसी भी प्रोफ़ाइल डेटा (डिफ़ॉल्ट से दूर) को बदलते हैं, तो आपको "डुप्लिकेट कुंजी" डेटाबेस त्रुटि मिल जाएगी।

+0

ने मेरी समस्या को पूरी तरह से हल किया: http://stackoverflow.com/questions/20214362/post-save-user-signal-that-creates-user-profile-is-being-called-twice-causing-du धन्यवाद! आपको लगता है कि यह उपयोगकर्ता/UserProfile व्यवस्थापक सेटअप django दस्तावेज का हिस्सा होगा। – chewynougat

+0

बहुत बहुत धन्यवाद! अंत में मुझे यह व्यवहार करने के लिए मिलता है क्योंकि इसे हाहा होना चाहिए –

0

आपको फॉर्म जोड़ने और बदलने पर विचार करना होगा। उपयोगकर्ता को बनाने का प्रयास करते समय आप उपयोगकर्ता को कोई त्रुटि नहीं दे पाएंगे। निम्नलिखित का परीक्षण किया गया है और 1.3:

class TeamInline(admin.StackedInline): 
    model = Team 
    fk_name = 'user' 
    max_num = 1 
    can_delete = False 

class TeamUserAdmin(UserAdmin): 
    list_display = ('username', 'email', 'company', 'expertise', 'contact_email', 'contact_phone', 'twitter', 'facebook', 'last_login_short', 'options') 
    list_select_related = True 

    def add_view(self, *args, **kwargs): 
    self.inline_instances = [] 
    return super(TeamUserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
    self.inline_instances.append(TeamInline(self.model, self.admin_site)) 
    return super(TeamUserAdmin, self).change_view(*args, **kwargs) 
संबंधित मुद्दे