2012-12-11 31 views
2

我從django.contrib.auth.models.User繼承創建了自定義用戶模型,並將其添加到我的管理員。當我從MyUser管理員創建一個實例,我有兩個(相關)的問題:使用自定義用戶登錄時出現「未知密碼散列算法」

在管理1,普通密碼(未uncrypted)顯示在password領域

2 - 當我嘗試在我的管理員登錄一個實例MyUser,我得到

Unknown password hashing algorithm '<mypassword>'. Did you specify it in the PASSWORD_HASHERS setting  

它是一個錯誤?我該如何解決這個問題? (我使用Django 1.4.2)

models.py

from django.contrib.auth.models import User 

class MyUser(User): 
    number = models.IntegerField() 

admin.py

class MyUserAdmin(admin.ModelAdmin): 
    pass 

admin.site.register(MyUser, MyUserAdmin) 

編輯

用下面的密碼設置正確,但是當我想修改一些MyUser時從管理員,密碼清除,我必須重新設置它:

class MyUserAdminForm(forms.ModelForm): 

    class Meta: 
     model = MyUser 

    def __init__(self, *args, **kwargs): 
     super(MyUserAdminForm, self).__init__(*args, **kwargs) 
     self.fields['password'].widget = forms.PasswordInput() 

    def save(self, commit=True): 
     user = super(MyUserAdminForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password"]) 
     if commit: 
      user.save() 
     return user 


class MyUserAdmin(admin.ModelAdmin): 
    form = MyUserAdminForm 


admin.site.register(MyUser, MyUserAdmin) 
+1

你是如何創建一個新用戶的?你能告訴我們代碼 – TheLifeOfSteve

+0

沒有代碼:我從'MyUser'管理員添加實例,位於'/admin//myuser/add /' – jul

回答

5

發生這種情況是因爲你沒有正確設置密碼的形式。

Django的auth用戶密碼應採用set_password()方法https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.set_password

通常保存在用戶管理形式方法需要照顧的這個設定,但既然你已經創建了自己的表格,你必須這樣做你自己。這是你需要你的管理形式保存方法的一個例子:

def save(self, commit=True): 
    user = super(UserCreationForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password"]) 
    if commit: 
     user.save() 
    return user 

編輯: 雖然這是你有這個錯誤的原因,我與史蒂夫同意,你應該使用用戶配置文件和發現的說明這裏:https://docs.djangoproject.com/en/1.4/topics/auth/#storing-additional-information-about-users

或者如果你可以等到django 1。5出來它有一個可配置的用戶模式:https://docs.djangoproject.com/en/dev/releases/1.5-beta-1/#configurable-user-model

編輯2: 這裏正是你需要保存使用正確的密碼是什麼:

forms.py

class MyUserAdminForm(forms.ModelForm): 
    password1 = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = MyUser 

    def save(self, commit=True): 
     user = super(MyUserAdminForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password"]) 
     if commit: 
      user.save() 
     return user 

管理.py

class MyUserAdmin(admin.ModelAdmin): 
    form = MyUserAdminForm 

admin.site.register(MyUser, MyUserAdmin) 
+0

表單看起來也是從'django.contrib.auth.models.User'繼承下來的(除了這個密碼問題,我和'User'一樣,所以我不知道爲什麼我應該重寫密碼的方式組。對我來說似乎仍然是一個錯誤。正如我向史蒂夫評論的那樣,直接從'User'繼承似乎對我來說比較乾淨,主要是因爲它更容易定製管理員。但如果這不起作用,我將別無選擇...... – jul

+0

管理員表單尚未被繼承,我可以從您的代碼中看到。你需要做的是改變這個: class MyUserAdmin(admin.ModelAdmin): fields =('username','password','number','first_name','last_name') admin.site.register (MYUSER,MyUserAdmin) 爲了這樣的事情: 類MyUserAdmin(admin.ModelAdmin): 形式= MyUserAdminForm admin.site.register(MYUSER,MyUserAdmin) 並保存方法我在上面顯示你的MyUserAdminForm類。 – Kevin

+0

如果我通過'pass'(我剛剛編輯我的問題)替換'fields =('username','password','number','first_name','last_name')'來改變MyUser' admin,我得到了所有字段的'django.contrib.auth.models.User'的模型形式,所以它似乎被繼承。 – jul

0

我建議你採取稍微不同的方法來擴展用戶類。

Django使用User Profiles作爲存儲關於用戶的附加信息的簡單方法。

您可以在新班級中做一到一個字段,這樣可以讓信息僅鏈接到一個用戶。

class MyUser(User): 
    user = models.OneToOneField(User) 

    #additional fields 
    number = models.IntegerField() 

文檔可以發現here - 允許你在管理部分使用以及

+0

我想你的意思是'class MyUser(models.Model)'。我意識到這一點,但直接從'django.contrib.auth.models.User'直接繼承我的模型,特別是從管理角度來看,我似乎更清潔。 – jul

相關問題