2012-07-18 15 views
5

User nesne yöneticisinin bazı şüpheli davranışlarıyla karşılaştım. Bu yöntemi kullanırsanız, User nesnesini oluşturmak için password alanı gerekli değildir. Sonuç olarak boş password ile User elde edersiniz. create_user yöntemini kullandığınızda ve password belirtmezseniz, User kullanılmayan parola (set_unusable_password()'a kadar) oluşturur.Kullanıcı yöneticisi yöntemleri create() ve create_user()

password olmadan kullanıcı oluşturmaya çalıştığınızda, neden create() yönteminin raise exception neden olmadığından emin değilim - bu alanın gerekli olduğu belirtildi. create() yöntem/belgelerinde bir sorun mu var?

cevap

9

. Eğer yönetim komutunu python manage.py sql çalıştırırsanız

  1. , auth_user şemaya dikkat: SQL

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

    , boş bir dize, ''User örneklerinde QuerySet.create() yöntemi kullanarak iki sorun vardır NULL, yani ISNULL('') != TRUE'a eşit değildir.

  2. QuerySet.create() ve QuerySet.update()modeli doğrulama tetiklemez. Model doğrulama, yalnızca ModelForm örnekleri, Model.full_clean() örnek yöntemini çağırdığında olur.

    QuerySet API ile çalışma bağlamında bir doğrulama hatasını yükseltmek, doğrudan Django'da hiçbir anlam ifade etmemektedir. Bu nedenle, CharField().validate(value='', None) boş bir dize için ValidationError yükseltmesine rağmen User.objects.create(username='foo', password='') gibi bir şey yapabilirsiniz. Yukarıdaki nedenlerden dolayı

, sen User.objects.create() kullanarak erteleyebilir ve modelin özel yöneticisinden sağlanan User.objects.create_user() yöntemine güvenmek gerekir.

+0

güzel genişletilmiş yanıt :-) yarat –

0

Django'nın kaynak kullanıcı modeli bak, orada özel bir yöneticisidir pasajı:

kullanıcı modeli kullanıcı oluşturmak için bir UserManager.create_user() yöntemi ile özel bir yöneticisi vardır tam olarak neden olduğunu
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

Bu şifrenin, create_user için gerekli olmadığını anlıyorum. Bazı dış kaynaklara karşı kimlik doğrulaması yaparsanız uygulandı. Ben sadece Kullanıcı yöneticisi create() yöntemi için uygun bir davranış olmadığını düşünüyorum. – sunprophit

+1

Hayır, Kullanıcı tanımlı bir özel yöneticiye sahip olduğu için ancak 'object' değişkenini kullanır –