2012-07-18 14 views
5

मुझे create()User ऑब्जेक्ट मैनेजर की विधि के कुछ संदिग्ध व्यवहार का सामना करना पड़ा है। ऐसा लगता है कि password फ़ील्ड User ऑब्जेक्ट बनाने के लिए आवश्यक नहीं है यदि आप इस विधि का उपयोग करते हैं। नतीजतन आप User खाली password के साथ प्राप्त करते हैं। यदि आप create_user विधि का उपयोग करते हैं और password निर्दिष्ट नहीं करते हैं तो यह User को अनुपयोगी पासवर्ड (set_unusable_password() के माध्यम से) बनाता है।उपयोगकर्ता प्रबंधक विधियां() और create_user()

मुझे यकीन नहीं है कि create() विधि raise exception नहीं है जब आप उपयोगकर्ता को password के बिना उपयोगकर्ता बनाने का प्रयास करते हैं - यह निर्दिष्ट है कि यह फ़ील्ड आवश्यक है। create() विधि/दस्तावेज में कुछ गलत है?

उत्तर

9

है यही कारण है कि उपयोगकर्ता मॉडल उपयोगकर्ता बनाने के लिए UserManager.create_user() विधि के साथ एक कस्टम प्रबंधक है।

  1. आप प्रबंधन कमांड python manage.py sql चलाते हैं, auth_user स्कीमा पर ध्यान देना:

    CREATE TABLE "auth_user" (
        ... 
        "password" varchar(128) NOT NULL, 
        ... 
    ) 
    

    एसक्यूएल में, एक खाली स्ट्रिंग, '' वहाँ User उदाहरणों पर QuerySet.create() विधि का उपयोग कर के साथ दो समस्याएं हैं , NULL, यानी ISNULL('') != TRUE के बराबर नहीं है।

  2. QuerySet.create() और QuerySet.update()मॉडल सत्यापन ट्रिगर नहीं करते। मॉडल सत्यापन केवल तभी होता है जब ModelForm उदाहरण Model.full_clean() इंस्टेंस विधि को कॉल करते हैं।

    QuerySet एपीआई के साथ काम करने के संदर्भ में सत्यापन त्रुटि को बढ़ाने से सीधे Django में कोई समझ नहीं आता है। यही कारण है कि आप User.objects.create(username='foo', password='') जैसे कुछ कर सकते हैं भले ही CharField().validate(value='', None) रिक्त स्ट्रिंग के लिए ValidationError उठाए।

उपरोक्त कारणों के लिए, आप User.objects.create() का उपयोग करने से स्थगित और मॉडल के कस्टम प्रबंधक से आपूर्ति की User.objects.create_user() विधि पर भरोसा करना चाहिए।

+0

अच्छा विस्तारित उत्तर :-) –

0

Django के स्रोत उपयोगकर्ता मॉडल पर देखो, वहाँ एक कस्टम प्रबंधक है, स्निपेट:

class UserManager(models.Manager): 
    # ... 
    def create_user(self, username, email=None, password=None): 
     """ 
     Creates and saves a User with the given username, email and password. 
     """ 
     now = timezone.now() 
     if not username: 
      raise ValueError('The given username must be set') 
     email = UserManager.normalize_email(email) 
     user = self.model(username=username, email=email, 
          is_staff=False, is_active=True, is_superuser=False, 
          last_login=now, date_joined=now) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 
+1

मैं समझता हूं कि create_user के लिए पासवर्ड की आवश्यकता नहीं है। यह लागू किया गया है यदि आप कुछ बाहरी स्रोत के खिलाफ प्रमाणित करते हैं। मैं बस सोच रहा हूं कि यह उपयोगकर्ता के प्रबंधक बनाने() विधि के लिए उचित व्यवहार नहीं है। – sunprophit

+1

नहीं, क्योंकि उपयोगकर्ता के पास एक कस्टम मैनेजर परिभाषित है लेकिन उसी चर 'ऑब्जेक्ट्स' का उपयोग करता है –

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