2009-05-22 13 views
11

डिफ़ॉल्ट Django के User मॉडल में कुछ फ़ील्ड और सत्यापन नियम हैं, जिनकी मुझे वास्तव में आवश्यकता नहीं है। मैं जितना संभव हो सके पंजीकरण करना चाहता हूं, यानी ईमेल या उपयोगकर्ता नाम, या फोन नंबर की आवश्यकता है - वे सभी अद्वितीय हैं, इसलिए उपयोगकर्ता पहचानकर्ता के रूप में अच्छा है।डिफ़ॉल्ट जरूरतों को पूरा करने के लिए डिफ़ॉल्ट django उपयोगकर्ता मॉडल को कैसे बदलें?

मुझे उपयोगकर्ता नाम के लिए डिफ़ॉल्ट वर्ण सेट भी पसंद नहीं है जो Django उपयोगकर्ता मॉडल में मान्य है। मैं वहां किसी भी चरित्र की अनुमति देना चाहता हूं - क्यों नहीं?

मैंने उपयोगकर्ता को प्रोफ़ाइल जोड़ने से पहले उपयोगकर्ता प्रोफ़ाइल django एप्लिकेशन का उपयोग किया - लेकिन इस बार मैं कक्षा को न्यूनतम बना दूंगा। लेकिन मैं अभी भी User कक्षा का उपयोग करना चाहता हूं, क्योंकि यह मुझे साइट के कुछ हिस्सों को केवल लॉग इन करने वाले उपयोगकर्ताओं के लिए प्रतिबंधित करने का एक आसान तरीका देता है।

मैं इसे कैसे कर सकता हूं?

उत्तर

8

उपयोगकर्ता वर्ग को सीधे संशोधित करने या उप-वर्गीकरण करने की बजाय, आप मौजूदा फ़ील्ड को भी पुनर्स्थापित कर सकते हैं।

एक साइट के लिए मैंने "first_name" फ़ील्ड को उपयोगकर्ता के "सार्वजनिक रूप से प्रदर्शित नाम" के रूप में उपयोग किया और "उपयोगकर्ता नाम" फ़ील्ड (यूआरएल में उपयोग के लिए) में इसका एक स्लिम संस्करण प्रस्तुत किया। मैंने लोगों को अपने "सार्वजनिक नाम" या उनके ईमेल पते का उपयोग करके लॉग इन करने की अनुमति देने के लिए एक कस्टम ऑथ बैकएंड लिखा, और मैं पंजीकरण समय पर उन दोनों की विशिष्टता को लागू करता हूं। यह अन्य पुन: प्रयोज्य ऐप्स के साथ अच्छी तरह से खेलता है और अतिरिक्त तालिकाओं या प्रश्नों को पेश नहीं करता है।

किसी अन्य साइट के लिए मैं केवल उपयोगकर्ता नाम नहीं चाहता था, केवल अद्वितीय ईमेल। एक अद्वितीय उपयोगकर्ता नाम के लिए Django की आवश्यकता को पूरा करने के लिए, मैंने अभी ईमेल पता धोया है और यूजरनेम के रूप में इस्तेमाल किया है (आपको हैश को बेस-एन्कोड करना है ताकि इसे 30 अक्षरों के नीचे निचोड़ दिया जा सके)। ईमेल के साथ लॉगिन की अनुमति देने के लिए कस्टम ऑथ बैकएंड।

यदि पिछड़ा-संगतता कोई समस्या नहीं थी, तो मुझे बहुत सारे सुधार हैं जो मुझे django.contrib.auth और उपयोगकर्ता मॉडल को और अधिक लचीला बनाने के लिए देखना पसंद करेंगे। लेकिन थोड़ी सी रचनात्मकता के साथ वर्तमान बाधाओं के अंदर आप काफी कुछ कर सकते हैं।

+0

कोई विचार ईमेल के साथ लॉगिन करने के लिए ऑथ बैकएंड कैसे बनाएं? – kender

+0

प्रारंभ करने के लिए इस स्निपेट को देखें: http://www.djangosnippets.org/snippets/74/ टिप्पणियां पढ़ने के लिए सुनिश्चित रहें, क्योंकि दूसरी टिप्पणी में कोड स्निपेट में उससे बेहतर है, और बहुत सारे अन्य प्रासंगिक मुद्दों को उन टिप्पणियों में उठाया गया है जिन्हें आप ध्यान में रखना चाहते हैं। –

7

Django उपयोगकर्ता मॉडल बहुत समझदारी से संरचित है। उदाहरण के लिए, आप वास्तव में उपयोगकर्ता नाम में मनमाने ढंग से वर्णों की अनुमति नहीं देना चाहते हैं, और आधार मॉडल में हैकिंग परिवर्तन किए बिना email address login प्राप्त करने के तरीके हैं।

उपयोगकर्ता खाते के आसपास अतिरिक्त जानकारी स्टोर करने के लिए, Django उपयोगकर्ता प्रोफाइल की धारणा का समर्थन करता है। जबकि आपको इसे संभालने के लिए अंतर्निहित समर्थन पर भरोसा करने की आवश्यकता नहीं है, यह एक ऐसा सम्मेलन है जिसका आमतौर पर पालन किया जाता है और यह आपको ईथर में घूमने वाले पुन: प्रयोज्य डीजेगो ऐप्स के साथ अच्छा खेलने की अनुमति देगा। अधिक जानकारी के लिए, here देखें।

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

+6

Django उपयोगकर्ता मॉडल को "समझदारी से" संरचित किया गया है यदि आप साइट बना रहे हैं, तो यह किसी विशेष सेट के लिए उचित उपयोगकर्ता मॉडल होगा। लेकिन एक फ्रेमवर्क के लिए मूल उपयोगकर्ता अमूर्तता के रूप में, यह वांछित होने के लिए कुछ लचीलापन छोड़ देता है। –

+2

मैं मानता हूं कि एक और प्लगिंग योग्य सिस्टम वांछनीय होगा –

7

मैंने प्रश्न को गलत तरीके से पढ़ा। उम्मीद है कि यह पोस्ट किसी और के लिए सहायक है।

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields here 

    def __str__(self): 
      return "%s's profile" % self.user 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      profile, created = UserProfile.objects.get_or_create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

#in settings.py 
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

यह एक userprofile हर बार अगर यह बनाई गई है एक उपयोगकर्ता सहेजा जाता है पैदा करेगा। फिर आप उपयोग कर सकते हैं

user.get_profile().whatever 

यहाँ डॉक्स

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

आप एक दुविधा यदि आप प्रोफ़ाइल से बचने के लिए प्रतिबद्ध हैं जो वास्तव में दो समाधान है का एक सा का सामना से कुछ और जानकारी है आधारित अनुकूलन पहले ही इंगित किया गया है।

  1. बदलें User मॉडल ही है, डैनियल सुझाव
  2. प्रति एक CustomUser वर्ग लिखें, User उपवर्गीकरण या अपनी कार्यक्षमता को कॉपी।

बाद सुझाव मतलब है कि आप कुछ चीजें हैं जो User स्वचालित रूप से मैन्युअल रूप से करता है को लागू करने के लिए होता है, लेकिन मुझे आश्चर्य है कि के रूप में यह लग रहा है, खासकर यदि आप अपनी परियोजना की शुरुआत में कर रहे हैं कि क्या उस के रूप में बुरा है। आपको बस एक मध्यम-वेयर क्लास और कुछ सजावटी को फिर से लिखना होगा।

बेशक, मुझे नहीं लगता कि यह आपको कुछ भी खरीदता है जो आपको नहीं मिलेगा, सिवाय इसके कि अगर आपकी परियोजना svn update आपकी डीजेंगो तोड़ नहीं देनी चाहिए। यह अन्य ऐप्स के साथ कुछ संगतता समस्याओं से बच सकता है, लेकिन मेरा अनुमान है कि ज्यादातर समस्याएं किसी भी तरह से मौजूद होंगी।

0

ऐसा करने के कई तरीके हैं, लेकिन मैं यहां क्या करूँगा: मैं उपयोगकर्ता को ईमेल, उपयोगकर्ता नाम (जिसमें कम से कम एक अक्षर और @ प्रतीकों) या मोबाइल नंबर दर्ज करना होगा। फिर, जब मैं इसे मान्य करता हूं:

  1. @ की उपस्थिति की जांच करें। यदि ऐसा है, तो इसे उपयोगकर्ता के ईमेल के रूप में सेट करें, इसे उचित रूप से हैश करें और इसे अपने उपयोगकर्ता नाम के रूप में भी सेट करें।
  2. यह देखने के लिए जांचें कि क्या यह केवल संख्याएं, डैश और + है। फिर, उपयुक्त पात्रों को पट्टी करें और इसे मोबाइल नंबर और उपयोगकर्ता नाम दोनों के रूप में स्टोर करें (यदि आप एसएमएस उद्देश्यों या किसी अन्य मॉडल के लिए किसी अन्य मॉडल में मोबाइल नंबर संग्रहीत कर रहे हैं)।
  3. यदि यह नहीं है, तो इसे केवल उपयोगकर्ता नाम के रूप में सेट करें।

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

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