2012-08-23 57 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(),它將正確設置密碼。