2009-11-11 17 views
6

मैं इस तरह Django के डिफ़ॉल्ट उपयोगकर्ता वर्ग का विस्तार किया है:Django: request.user के लिए कस्टम क्लास का उपयोग करें?

class CustomUser(User): 
    friends = models.ManyToManyField('self', symmetrical=False) 

लेकिन अब मैं उपयोग करना चाहते हैं कि हर जगह डिफ़ॉल्ट User वर्ग के बजाय। मेरे दृश्य तरीकों में, मेरे पास request.user तक पहुंच है लेकिन यह User कक्षा का एक उदाहरण है। इसके बजाय इसे CustomUser वापस करने का सबसे आसान तरीका क्या है? ।

class CustomUser(models.Model): 
    user = models.ForeignKey(User, unique=True) 

तो तुम जब मिलती है:

उत्तर

6

आप अपने मॉडल.py में कहीं भी मौजूदा उपयोगकर्ता मॉडल "बंदर पैच" भी कर सकते हैं और इसे केवल काम करना चाहिए। अपने कोड में बस मूल वर्ग का उपयोग करते रहें।

User.add_to_class('friends',models.ManyToManyField('self', symmetrical=False)) 
+0

ओह! इच्छा है कि मैं कुछ दिनों पहले इसके बारे में जानता था। लेकिन धन्यवाद! मैंने उस प्रोजेक्ट को पूरा कर लिया है इसलिए मैं वापस नहीं जा रहा हूं और अभी यह कोशिश कर रहा हूं; मैं बस यह काम मानूंगा। सबसे आसान समाधान होता। – mpen

+0

निश्चित रूप से, सिंटैक्स में हालांकि छोटे बदलाव (मैंने दोस्तों = मॉडल का उपयोग किया है। मैनी टॉनी) पहली बार – Evgeny

1

मुझे लगता है कि आपकी समस्या का सबसे तेज समाधान बस CustomUser.objects.get(user=user) कॉल करने के लिए (यह मानते हुए है उपयोगकर्ता अपने CustomUser मॉडल एक विशेषता होती है होगा मुझे क्या होगा पीछा कर रहा है कस्टमयूसर की एक क्वेरीसेट, आप अनुरोध पर अपने उपयोगकर्ता के फ़िल्टर का उपयोग करने के आधार पर इच्छित फ़िल्टर को फ़िल्टर कर सकते हैं।

अन्यथा आप उपयोगकर्ताओं के बजाय कस्टमयूसर को शामिल करने के लिए मिडलवेयर को संशोधित कर सकते हैं, लेकिन मुझे यकीन नहीं है कि कैसे ऐसा करने के लिए;)

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

Here यह है।

+0

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

+1

आह, मैं देखता हूं कि आप किस बारे में बात कर रहे थे। मुझे लगता है कि यह लिंक आपको वही प्रदान करेगा जो आप खोज रहे हैं! http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/ – shawnjan

+0

हाँ, मैं कोशिश कर रहा हूं लेकिन ऐसा लगता है कि यह मेरे ModelBackend ... यह अभी भी डिफ़ॉल्ट का उपयोग कर रहा है, भले ही मैंने 'AUTHENTICATION_BACKENDS' निर्दिष्ट किया है ... – mpen

5

मुझे यकीन नहीं है कि आप इसे ठीक से कर सकते हैं, लेकिन आप Django user_profile सुविधा का उपयोग करके अपने कस्टम यूज़र विशेषताओं तक पहुंच सकते हैं।

अपने settings.py में:

AUTH_PROFILE_MODULE = 'myapp.CustomUser' 

आपके विचार में:

user_friends = user.get_profile().friends 

चेक बाहर और अधिक जानकारी के लिए इस link

+0

मुझे लगता है कि यह आपको विरासत की बजाय 'उपयोगकर्ता' को विदेशी कुंजी के रूप में सेट करने की आवश्यकता है ... – mpen

+0

यह करने का यह सही तरीका है। –

+1

यह आपकी समस्या को संभालने का पसंदीदा तरीका है। यह आपको मौजूदा मॉड्यूल को संशोधित करने से बचाता है। अकेले django.contrib.auth छोड़ दो, और अपने परिवर्तन अपने कोड में करें। – jcdyer

3

यह सब here समझाया गया है। request.user समस्या को प्रमाणीकरण बैकएंड का उपयोग करके हल किया गया था। मैंने लेखक के निर्देशों के अनुसार एक कस्टम उपयोगकर्ता को लागू किया और तब से खुश रहे हैं।

+0

मैंने पाया और इसे आजमाया, लेकिन मुझे यह काम नहीं लग रहा था। आईएमओ, आपको बैकएंड को प्रतिस्थापित नहीं करना चाहिए। – mpen

+0

समस्या क्या थी? मैं कस्टम बैकएंड के साथ सहज हूं, लेकिन यदि आप इसका उपयोग नहीं करना चाहते हैं तो आप उस पोस्ट में से किसी एक टिप्पणी में सुझाए गए अनुसार एक मिडलवेयर लिख सकते हैं। – shanyu

+0

यह यहां 'तेह जीत' समाधान है। गोंद कोड की एक छोटी राशि और आपको इसके बारे में फिर से चिंता करने की ज़रूरत नहीं है। आपके ऐप में हर जगह आपका कस्टम उपयोगकर्ता मॉडल मिलता है। –

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