2016-04-05 23 views
1

Django'da özel bir kullanıcı modeli oluşturmaya çalışıyorum. Benim models.py şuna benzer:Django'da özel bir kullanıcı modeli kullanırken şifrem neden güvenceye alınmıyor?

class UserManager(BaseUserManager): 

    def _create_user(self, username, email, password, is_staff, is_superuser, **extra_fields): 
     now = timezone.now() 
     if not username: 
      raise ValueError(_('The given username must be set')) 
     if not email: 
      raise ValueError(_('The given email must be set')) 
     email = self.normalize_email(email) 
     user = self.model(
      username=username, email=email, 
      is_staff=is_staff, is_active=False, 
      is_superuser=is_superuser, last_login=now, 
      date_joined=now, **extra_fields 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_user(self, username, email, password=None, **extra_fields): 
     return self._create_user(username, email, password, False, False, **extra_fields) 

    def create_superuser(self, username, email, password, **extra_fields): 
     user=self._create_user(username, email, password, True, True, **extra_fields) 
     user.is_active=True 
     user.save(using=self._db) 
     return user 

class User(AbstractBaseUser, PermissionsMixin): 
    # Standard fields 
    username = models.CharField(_('username'), max_length=30, unique=True, 
     help_text=_('Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters'), 
     validators=[ 
     validators.RegexValidator(re.compile('^[\[email protected]+-]+$'), _('Enter a valid username.'), _('invalid')) 
    ]) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True, null=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True, null=True) 
    email = models.EmailField(_('email address'), max_length=255) 
    is_staff = models.BooleanField(_('staff status'), default=False, 
     help_text=_('Designates whether the user can log into this admin site.')) 
    is_active = models.BooleanField(_('active'), default=True, 
     help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    # Custom fields 
    is_publisher = models.BooleanField(_('publisher status'), default=False) 

    # User manager 
    objects = UserManager() 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['email'] 

    class Meta: 
     verbose_name = _('user') 
     verbose_name_plural = _('users') 

    def get_full_name(self): 
     full_name = '%s %s' % (self.first_name, self.last_name) 
     return full_name.strip() 

    def get_short_name(self): 
     return self.first_name 

    def email_user(self, subject, message, from_email=None): 
     send_mail(subject, message, from_email, [self.email]) 

Neyse, createsuperuser komutunu kullanarak bir süper kullanıcı oluşturmak eğer, her şey iyi çalışır: kullanıcı oluşturulduğunda, ve şifrenin doğru karma ve sabitlenir. Ancak, yönetici panelimden bir kullanıcı oluşturursam, oluşturulan kullanıcının şifresi tamamen açıkta kalır. Ayrıca, Django'da kullanılan normal kullanıcı modelinde yaptığı onaylama alanı görünmüyor. Bu sorunu nasıl çözebilirim?

Ayrıca, evet benim settings.py dosyasında AUTH_USER_MODEL = 'myapp.User' var.

+0

Parolayı ele almakla ilgilenen bir model yönetici sınıfı kullanmanız gerekir. Daha fazla bilgi için bkz. [Docs'daki örnek] (https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#a-full-example). – Alasdair

cevap

0

def home(request): if request.method == 'POST': uf = UserForm(request.POST, prefix='user') upf = UserProfileForm(request.POST, prefix='userprofile') if uf.is_valid() * upf.is_valid(): userform = uf.save(commit=False) userform.password = make_password(uf.cleaned_data['password']) userform.save() messages.success(request, 'successful Registration', extra_tags='safe') else: uf = UserForm(prefix='user') return render_to_response('base.html', dict(userform=uf ), context_instance=RequestContext(request))

Django formundan şifre almak için bu ve forms.py denemede kullanmayı deneyin. Bu

0

bir hayır özel kodla form ve password alana doğrudan erişim, şifre alanına doğrudan yazar işe yarar. Oluşturucu veya createuperuser için çağrı yapılmadı, bu nedenle set_password hiçbir zaman çağrılmaz (varsayılan olarak, bir ModelForm, save çağrıldığında, modele save çağrılır). kullanıcı parolasını yazarken, güvenli bir parola yazmadığını unutmayın (bu nedenle createuser ve createsuperuser numaralı telefonu arayın set_password). Bunu yapmak için, çağırarak, bunun yerine, sahada doğrudan yazma ama kaçının:

myuserinstance.set_password('new pwd') 
# not this: 
# myuserinstance.password = 'new pwd' 

Yani özel bir formda özel mantık kullanmalıdır. See the implementation for details; you will notice those forms have custom logic calling set_password and check_password. Django'daki BTW varsayılan UserAdmin bir kullanıcıyı TWO adımında oluşturur: kullanıcı/parola/password_confirm (böyle bir parola oluşturur) ve tüm kullanıcı verileri. Bunun için çok özel bir uygulama var.