2010-09-14 15 views
18

मैं अपने कोड में कई स्थानों पर request.user.get_profile() का उपयोग करता हूं। हालांकि सभी उपयोगकर्ताओं के पास उनके खाते के साथ उपयोगकर्ता प्रोफ़ाइल का आकलन नहीं होता है। क्या request.user.get_profile() पर कॉल करते समय मैं कोई उपयोगकर्ता प्रोफ़ाइल स्वचालित रूप से बना सकता हूं यदि उनके पास request.user.get_profile() कॉलों में से प्रत्येक को बदलने के बिना कोई नहीं है। शायद सिग्नल या कुछ का उपयोग कर।Django उपयोगकर्ता प्रोफाइल बनाने के लिए मौजूद नहीं है

मेरी समस्या यह है कि मैं एक एकल साइन-इन लॉगिन का उपयोग करता हूं, इसलिए यदि कोई अन्य सिस्टम पर लॉग इन करता है और फिर मेरी साइट पर जाता है तो वे लॉग इन होते हैं लेकिन उपयोगकर्ता प्रोफ़ाइल नहीं बनाते हैं (मैं उपयोगकर्ता बनाता हूं जब वे लॉग इन करते हैं तो प्रोफ़ाइल)।

+0

आप की जाँच इस अतः http://stackoverflow.com/questions/17806683/create-row सवाल कृपया कर सकते हैं -of-date-while-create-superuser जो मुझे समस्या का सामना कर रहा है, – user2086641

उत्तर

22

आमतौर पर उपयोगकर्ता प्रोफ़ाइल ऑब्जेक्ट्स उपयोगकर्ता के निर्माण के बाद बनाया गया है। यह सिग्नल का उपयोग करके आसानी से पूरा किया जाता है।

The problem I have is that I use a single sign-in login so if someone logs in on another system and then goes to my site they are logged in but don't get a user profile created (I create a user profile when they log in).

स्पष्ट रूप से उपयोगकर्ता निर्माण समय पर सिग्नल का उपयोग करने से आपके लिए काम नहीं करेगा। आप जो करने की कोशिश कर रहे हैं उसे पूरा करने का एक तरीका कस्टम फ़ंक्शन के साथ request.user.get_profile() पर कॉल को प्रतिस्थापित करना होगा। get_or_create_user_profile(request) कहें। यह फ़ंक्शन किसी उपयोगकर्ता की प्रोफ़ाइल को पुनर्प्राप्त करने का प्रयास कर सकता है और फिर फ्लाई पर एक बना सकता है यदि कोई अस्तित्व में नहीं है।

def get_or_create_user_profile(request): 
    profile = None 
    user = request.user 
    try: 
     profile = user.get_profile() 
    except UserProfile.DoesNotExist: 
     profile = UserProfile.objects.create(user, ...) 
    return profile 
+1

आने में सक्षम नहीं है। मुझे यह जवाब पसंद है लेकिन मेरे कोड में request.user.get_profile() के सभी उदाहरणों को बदलने पर उत्सुक नहीं था। क्या कोई संकेत नहीं है जिसे मैं UserProfile post_get से जोड़ सकता हूं (मुझे नहीं पता कि यह मौजूद है या नहीं) – John

+0

@ जॉन: AFAIK सिग्नल में कोई भी निर्मित नहीं है जिसे 'get'' ('post_get' जैसा आपने कहा था) पर भेजा गया है। दस्तावेज सहमत हैं http://docs.djangoproject.com/en/dev/ref/signals/ –

+0

मिडलवेयर के माध्यम से इसे करने के बारे में क्या? – John

3

मैं इस समाधान मैं इस साइट पर उपयोग करना चाहते पाया:

उदाहरण के लिए

http://www.turnkeylinux.org/blog/django-profile

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

का उपयोग करते हुए इस तरह एक संपत्ति एक नई पद्धति को परिभाषित करने की तुलना में क्लीनर लगता है, लेकिन मैं इस बात से सहमत यह आपके कोड बेस के माध्यम से जाने और user.get_profile()user.profile के संदर्भों को बदलने के लिए दर्द होगा।

फिर फिर, यह नहीं है कि आपकी वैश्विक फ़ाइल खोज और प्रतिस्थापन फ़ंक्शन क्या है?

+0

आमतौर पर पहले उपयोगकर्ता (सुपरसियर) की प्रोफ़ाइल नहीं बनाई जाएगी क्योंकि यह './manage.py startapp' के दौरान बनाई गई थी। – hobbes3

+2

इस समाधान के साथ समस्या यह है कि जब भी आप User.profile का संदर्भ देते हैं तो प्रोफ़ाइल को पुनर्प्राप्त करने के लिए यह डीबी को हिट करेगा। जैसे यदि आप कुछ ऐसा करते हैं: User.profile.field = "derp" तो User.profile.save(), यह पुनः लोड होगा। डीबी से प्रोफाइल करें और सहेजने से पहले अपने परिवर्तन खो दें। प्वाइंट यह गुणों का एक बुरा उपयोग है। उस कार्यक्षमता के लिए एक विधि का उपयोग करें imo – sqwerty

+0

हम्म मुझे नहीं लगता कि यह गुणों का खराब उपयोग है। हालांकि मैं एक सुधार पोस्ट करूंगा। –

3

bskinner के जवाब पर और sqwerty की टिप्पणी के जवाब में बिल्डिंग, तो आप इस का उपयोग कर सकते: अगर जरूरत

def get_or_create_profile(user): 
    """ 
    Return the UserProfile for the given user, creating one if it does not exist. 

    This will also set user.profile to cache the result. 
    """ 
    user.profile, c = UserProfile.objects.get_or_create(user=user) 
    return user.profile 

User.profile = property(get_or_create_profile) 

तो यह एक प्रोफ़ाइल बना देगा, और User.profile.field = "deep" तो User.profile.save() काम करता है।

1

नीचे के रूप में संशोधित। अन्यथा, "विशेषता त्रुटि: विशेषता सेट नहीं कर सकता" दिखाया जाएगा। अभिभावक असाइन अनुमति यहां वैकल्पिक है।

 
def get_or_create_profile(user): 
    profile, created = UserProfile.objects.get_or_create(user=user) 
    assign('change_userprofile', user, profile) 
    assign('delete_userprofile', user, profile) 
    return profile 

User.profile = property(get_or_create_profile) 
1

यहाँ एक जल्दी प्रबंधन आदेश है कि किसी भी उपयोगकर्ताओं को, जो उन्हें कमी है के लिए डिफ़ॉल्ट प्रोफाइल बनाने के लिए इस्तेमाल किया जा सकता है। जगह में इस के साथ आप किसी भी समय ./manage.py missing_profiles चला सकते हैं, या एक क्रॉन जॉब के लिए इसे जोड़ने, आदि

from django.core.management.base import BaseCommand 
from django.contrib.auth.models import User 
from people.models import Profile 

''' 
Create default profiles for any User objects that lack them. 
''' 


class Command(BaseCommand): 
    help = "Create default profiles for any User objects that lack them." 

    def handle(self, *args, **options): 
     users = User.objects.filter(profile=None) 
     for u in users: 
      Profile.objects.create(user=u) 
      print("Created profile for {u}".format(u=u)) 
संबंधित मुद्दे