Django टेम्पलेट में उपयोगकर्ता प्रोफ़ाइल कैसे एक्सेस करें?


88

मैं कुछ अतिरिक्त प्रति-उपयोगकर्ता जानकारी संग्रहीत कर रहा हूं AUTH_PROFILE_MODULE

हम एक Django टेम्पलेट में उपयोगकर्ता का उपयोग कर सकते हैं {{ request.user }}लेकिन हम प्रोफ़ाइल में फ़ील्ड्स का उपयोग कैसे करते हैं क्योंकि प्रोफ़ाइल केवल एक फ़ंक्शन के माध्यम से सुलभ है user.get_profile()?

क्या वास्तव में हर बार प्रोफ़ाइल को टेम्पलेट में स्पष्ट रूप से पास करना आवश्यक है?

जवाबों:


136

का उपयोग करें {{ request.user.get_profile.whatever }}। Django की अस्थायी भाषा स्वचालित रूप से कॉल करने योग्य चीजों को कॉल करती है - इस मामले में, .get_profile()विधि।


3
Docs.djangoproject.com/en/dev/topics/templates/#variables देखें नियम बहुत अच्छे हैं।
एस.लॉट

3
यह Django 1.5 और ऊपर में चित्रित किया गया है और Django 1.7 और ऊपर में काम नहीं करता है। आधुनिक Django में यह कैसे करें के लिए सच्चा राऊ का जवाब देखें।
माइकल

27

यह निश्चित नहीं है कि यह मेरे लिए अलग क्यों है, लेकिन मुझे {{request.user}} के बजाय {{user}} का उपयोग करने की आवश्यकता है।


5
डॉक्स कहते हैं ( docs.djangoproject.com/en/dev/topics/auth/… ) जिसे आप उपयोगकर्ता को {{user}}, जैसा कि आप कहते हैं, तक पहुँचा सकते हैं।
Xiong Chiamiov

2
{{User}} और न {{request.user}} का उपयोग करने का असली कारण यह है कि आप अनुरोध के लिए टेम्पलेट संदर्भ प्रोसेसर को शामिल नहीं करते हैं। https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
लिंक Django 1.10 के लिए थोड़ा अलग है, लेकिन यह विचार एक ही है, django.template.context_processors.requestआवेषण requestटेम्पलेट में है, जबकि django.contrib.auth.context_processors.authआवेषण userसंदर्भ में। docs.djangoproject.com/en/1.10/ref/templates/api/…
आंद्रेई-निकुले पेट्रे

8

हां, request.user.get_profile का उपयोग करके टेम्पलेट से प्रोफ़ाइल तक पहुंचना संभव है

हालांकि, एक छोटा सा चेतावनी है : सभी उपयोगकर्ताओं के पास प्रोफ़ाइल नहीं होगी, जो कि व्यवस्थापक उपयोगकर्ताओं के साथ मेरे मामले में थी। इसलिए {{ request.user.get_profile.whatever }}टेम्प्लेट से सीधे कॉल करने से ऐसे मामलों में त्रुटि होगी।

यदि आप सुनिश्चित हैं कि आपके सभी उपयोगकर्ताओं के पास हमेशा प्रोफ़ाइल हैं तो इसे टेम्पलेट से कॉल करना सुरक्षित है, अन्यथा get_profile()अपने विचार में प्रयास-सिवाय ब्लॉक के भीतर से कॉल करें और इसे टेम्पलेट को पास करें।


यह उत्तर भ्रामक है - मैंने परीक्षण नहीं किया है {{ request.user.get_profile.whatever }}, लेकिन {{ request.user.get_profile }}काम करेगा और इसका उपयोग यह जांचने के लिए किया जा सकता है कि वर्तमान संस्करणों में प्रोफ़ाइल मौजूद है या नहीं। Docs.djangoproject.com/en/dev/ref/templates/api/… देखें । एक नोट है कि विकास संस्करण में बदल जाएगा, हालांकि, मैं जिस से जुड़ा हुआ हूं उसके ऊपर पैराग्राफ देखें।
रालोक

@tkolar, यहाँ वास्तव में भ्रामक क्या है? यदि उपयोगकर्ता के पास कोई प्रोफ़ाइल नहीं है और आप get_profile.something को कॉल कर रहे हैं जो एक त्रुटि का कारण होगा।
सर्गेई गोलोवचेंको

4

यदि आप Django> 1.5 का उपयोग कर रहे हैं, तो आप अब उपयोग नहीं कर सकते get_profile

यदि आपके पास एक विरासत ऐप है, तो आपको AUTH_PROFILE_MODULE = 'myapp.profile'अपने से हटा देना चाहिए settings.py

यदि आप models.OneToOneField(User)अपनी प्रोफ़ाइल कक्षा में उपयोग करते हैं, तो आप बस उपयोग कर सकते हैं

{{ request.user.profile.whatever }}

अपने Django टेम्पलेट में


1
@AlexStewart का मतलब है कि अब हमें requestसामने वाले कीबोर्ड की आवश्यकता नहीं है ?
लुक एरन

3

यदि यह किसी की मदद करता है, तो मैंने अपने खाके में अनुसरण का उपयोग किया:

उपयोगकर्ता नाम: {{ user.username }}

उपयोगकर्ता का पूरा नाम: {{ user.get_full_name }}

यूजर ग्रुप: {{ user.groups.all.0 }}

ईमेल: {{ user.email }}

सेशन शुरू हुआ: {{ user.last_login }}

एक नमूना परिणाम इस प्रकार है:

उपयोगकर्ता: ऑडिटर ezio

उपयोगकर्ता समूह: लेखा परीक्षा

उपयोगकर्ता नाम: testUser03

ईमेल: testuser03@auditor.com

सत्र शुरू हुआ- 16 अप्रैल, 2018, रात 9:38 बजे

धन्यवाद :)


1

काम कर रहे !

अपने प्रोफ़ाइल मॉडल में संबंधित_नाम प्रदान करें

user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)

फिर टेम्पलेट उपयोग में। यहाँ company_name प्रोफ़ाइल तालिका में फ़ील्ड है

{{ request.user.user_profile.company_name }}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.