41

Привет, Я использую класс модели django с некоторым полем и полем пароля. Вместо обычного текстового текста я хочу отобразить ввод пароля. Я создал класс модели, как это:Как создать поле ввода пароля в 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

ответ

50

Вам необходимо включить в свой импорт следующее:

from django import forms 
+0

Я тоже пробовал ... я не получаю никаких ошибок сейчас. но получение одинакового ввода текста для поля пароля. также голосование вопрос вниз не решит мою проблему. –

+17

@ DarHamid Я не техническая поддержка. Я ответил на ваш вопрос, если у вас другая проблема - задайте другой вопрос. Но можете ли вы отлаживать себя в течение некоторого времени? Может быть, вы где-то пропустили пару круглых скобок? Может быть, первое и второе поля пароля не должны иметь одно и то же имя? Попытка - лучший способ узнать. – DrTyrsa

+0

Я ценю ваш ответ. Но я havnt пропустил любую скобку или так. Кроме того, я поместил имя поля пароля в класс модели так же, как и в modelForm.Thanks any way –

50

Виджет должен быть вызовом функции, а не свойством. Вам не хватало скобок.

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

Действительно ли скобки нужны? Вы просто исправите поле PasswordInput во время инициализации вместо того, чтобы создавать их снова для каждого UserForm. – blacklwhite

+0

Не верно, Django специально обрабатывает это с помощью 'if isinstance (widget, type): widget = widget()' – kibibu

+0

Почему django создает текстовое поле для пароля? очевидно, что у вас есть пароль для ввода пароля? – Clayton

13

@DrTyrsa правильный. Не забудьте свои круглые скобки.

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

Это очень просто.

Вы должны получить password форму поля из Meta класс.