41

嗨,我正在使用帶有某個字段和密碼字段的django模型類。我想顯示密碼輸入,而不是普通純文本中的diplay。我創造了這樣一個模型類:如何在django中創建密碼輸入域

class UserForm(ModelForm): 
    class Meta: 
     password = forms.CharField(widget=forms.PasswordInput) 
     model = User 
     widgets = { 
      'password': forms.PasswordInput(), 
     } 

但我得到以下錯誤:NameError:名字「形式」沒有定義。

我正在使用django版本1.4.0。我跟着這個鏈接:Django password problems

仍然收到相同的錯誤。我該怎麼辦。我在哪裏得到錯誤。請幫助

+0

我試圖使用PasswordInput作爲字段定義,它沒有工作。 'widget = forms.PasswordInput'完成了我的表單工作。 – anno1337 2014-07-28 11:19:17

回答

50

您需要在導入中包含以下內容;

from django import forms 
+0

我也嘗試過......我現在沒有收到任何錯誤。但爲密碼字段獲得相同的文本輸入。也投下這個問題並不能解決我的問題。 – 2012-02-17 07:37:57

+17

@達哈米德我不是技術支持。我已經回答了你的問題,如果你還有其他問題 - 請提出另一個問題。但是你可能應該自己調試一段時間嗎?可能你錯過了一些括號嗎?可能是第一和第二個密碼字段不應該有相同的名稱?嘗試是最好的學習方式。 – DrTyrsa 2012-02-17 07:43:43

+0

我很感謝你的回答。但我很想念任何括號。此外,我還將模型類中的密碼字段的名稱與modelForm中的名稱相同。感謝任何方式 – 2012-02-17 07:48:19

50

小部件需要是函數調用,而不是屬性。你錯過了括號。

class UserForm(ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput()) 
    class Meta: 
     model = User 
+0

括號是否真的有必要?您只需在初始化期間修復PasswordInput字段,而不是爲每個UserForm再次創建它們。 – blacklwhite 2014-01-21 08:59:21

+0

不正確,Django專門處理這個'if isinstance(widget,type):widget = widget()' – kibibu 2014-02-03 05:03:01

+0

爲什麼django爲密碼創建文本字段?它顯然有密碼輸入的密碼字段? – Clayton 2014-03-21 06:37:02

13

@DTTyrsa是正確的。不要忘記你的括號。

from django.forms import CharField, Form, PasswordInput 

class UserForm(Form): 
    password = CharField(widget=PasswordInput()) 
12

爲什麼不創建您自己的密碼字段,您可以在所有模型中使用它。

from django import forms 

class PasswordField(forms.CharField): 
    widget = forms.PasswordInput 

class PasswordModelField(models.CharField): 

    def formfield(self, **kwargs): 
     defaults = {'form_class': PasswordField} 
     defaults.update(kwargs) 
     return super(PasswordModelField, self).formfield(**defaults) 

所以現在在模型中使用

password = PasswordModelField() 
0

這很簡單。

您應該從Meta類中獲得password表單域。