无法在模板中通过ModelForm获取密码输入框

0 投票
1 回答
728 浏览
提问于 2025-04-17 10:25

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' 字段设置标签呢?这个标签应该是 重复密码

另外,我可以把 def cleanUsersModelForm 中去掉吗?我想在 views.py 中比较 passwordrepeatpassword,而不是在 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

正确的做法是使用 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 ...

撰写回答