Не удается получить поле ввода пароля в шаблоне с использованием ModelForm - PullRequest
0 голосов
/ 17 января 2012

models.py:

class Users(models.Model):
    username = models.CharField(max_length=255)
    slug = models.CharField(max_length=255, default='0')
    password = models.CharField(max_length=300)
    password_token = models.CharField(max_length=300, default='0')
    email = models.CharField(max_length=255)
    email_verified = models.BooleanField(default=False)
    email_token = models.CharField(max_length=255)
    email_token_expiry = models.DateTimeField()
    tos = models.BooleanField(default=False)
    active = models.BooleanField(default=False)
    last_login = models.DateTimeField(auto_now_add=True)
    last_action = models.DateTimeField(auto_now_add=True)
    is_admin = models.BooleanField(default=False)
    role = models.CharField(max_length=255, default='0')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.username

class UsersModelForm(forms.ModelForm):
    passwordrepeat = forms.PasswordInput()

    class Meta:
        model = Users
        fields = ('username', 'password', 'email')
        widgets = {
            'password' : forms.PasswordInput(),
        }

    def clean(self):
        cleaned_data = self.cleaned_data
        password = cleaned_data.get("password")
        passwordrepeat = cleaned_data.get("passwordrepeat")
        if password != passwordrepeat:
            raise forms.ValidationError("Passwords must match.")

        return cleaned_data

В шаблоне я получаю

username
password
email

Я не могу получить поле ввода passwordrepeat в шаблоне.И как я могу установить метку для поля «passwordrepeat».Метка будет Repeat Password

И можно ли опустить def clean из UsersModelForm.Я хочу сравнить password и repeatpassword в views.py, а не models.py.

views.py:

def register(request):
    flag = True
    possible = '0123456789abcdefghijklmnopqrstuvwxyz'
    token = ''
    tempToken = ''

    current_datetime = datetime.datetime.now()

    user = UsersModelForm()
    if request.method == 'POST':
        userf = UsersModelForm(request.POST)
        username = userf.data['username']
        password = userf.data['password']
        passwordrepeat = userf.data['passwordrepeat']
        email = userf.data['email']

        tempSalt = bcrypt.gensalt()
        password = bcrypt.hashpw(password,tempSalt)
        passwordrepeat = bcrypt.hashpw(passwordrepeat,tempSalt)

        if password != passwordrepeat:
            flag = False
            passVariable = {'user':user, 'flag': False}
            return render_to_response('register.html', passVariable, context_instance=RequestContext(request))

        elif password == passwordrepeat:
            for i in range(1,10):
                temp = random.choice(possible)
                token = token + temp

            if userf.is_valid():
                check = userf.save(commit=False)
                check.email_token = token
                check.email_token_expiry = current_datetime + timedelta(1)
                check.password = password
                check.passwordrepeat = passwordrepeat
                check.save()
                subject, from_email, to = 'hello', 'xxx@gmail.com', 'xxx@yahoo.com'
                text_content = 'This is an important message.'
                html_content = '<a href="http://127.0.0.1:8000/confirm/' + token + '">Click this link to confirm email</a>'
                msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
                msg.attach_alternative(html_content, "text/html")
                msg.send()
                return HttpResponseRedirect('/')
    else:
        return render_to_response('register.html', {"user": user, 'flag': True}, context_instance=RequestContext(request))

1 Ответ

5 голосов
/ 17 января 2012

Правильный ответ: используйте django-registration . И Django встроенная система аутентификации. Не изобретай велосипед.

Ответьте на свой вопрос: вы не видите passwordrepeat, потому что forms.PasswordInput - это не поле, это виджет. Виджет не может быть отображен без поля. Вы должны использовать CharField с PasswordInput здесь. Если вы хотите установить метку, установите ее, аргумент label выглядит хорошо для этой задачи.

passwordrepeat = forms.CharField(widget=forms.PasswordInput, label=u'Repeat Password')

Форма

class UsersModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UsersModelForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['username', 'password', 'passwordrepeat', 'email']

    # ... other fields and methods ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...