2012-08-23 58 views
4

我自定义Django的用户模块,并增加了一些额外的字段Django的:如何在Django AUTH_USER表密码存储

我的模型看起来像

class Drinker(models.Model): 
    user = models.OneToOneField(User) 
    birthday = models.DateField() 
    name  = models.CharField(max_length = 100) 

    def __unicode__(self): 
     return self.name 

这里是我的注册视图

def DrinkerRegistration(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/profile/') 
    if request.method == "POST": 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      user = User.objects.create(username = form.cleaned_data['username'],email = form.cleaned_data['email'],password = form.cleaned_data['password']) 
      user.save() 
      drinker = Drinker(name = form.cleaned_data['name'],birthday = form.cleaned_data['birthday'],user=user) 
      drinker.save() 
      return HttpResponseRedirect('/profile/') 
    else: 
     form = RegistrationForm() 
     context = {'form':form} 
     return render_to_response('register.html',context,context_instance = RequestContext(request)) 

现在我的问题是,当用户在我的auth_user表中注册的密码存储在计划文本,即导致

Unknown password hashing algorithm '123'. Did you specify it in the PASSWORD_HASHERS setting? 

错误在登录时

但对于超级用户的密码是SHA1格式(我不知道)在AUTH_USER表,他们可以登录

请建议我如何散列密码在这里?

+0

如果您尝试将合法输入直接存储在饮水器模型中,会发生什么情况?它工作吗? –

回答

4

请勿使用User.objects.create(),请使用User.objects.create_user() - 它会使用正确的算法散列提供的密码。

+0

耶是得到它的感谢和一个更多的想我需要在我的设置使用PASSWORD_HASHERS – user1614526

+0

不,只要你没有现有的用户数据库与你的Django版本的默认不同的密码哈希算法(目前版本 - 1.4 - 是PBKDF2)。如果您只是创建新用户,则使用默认设置即可。 –

0

您应该让User.set_password散列密码并以适当的格式存储它,或使用其他答案中提到的相应管理器函数。

基本上你从来没有要求Django散列密码,并试图将纯文本放入数据库中。在这样做时,Django预期的格式(hasher salt hashed_pa​​ss)没有被满足,因此错误。

更棒的是,应用程序的这些部分最好使用可重用的应用程序,例如Django注册。

然后,您可以使用信号在用户注册(创建后)后创建饮水器配置文件。

0

您需要使用帮助函数create_user(),它将正确设置密码。