如何在注册/创建帐户时将密码与retypepassword进行比较,而不在models.py中使用字段'retyppassword'?

shi*_*bly 0 python forms passwords django templates

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)
    passwordrepeat = models.CharField('Repeat Password', 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(auto_now_add=True)
    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):
    class Meta:
        model = Users
        fields = ('username', 'password', 'passwordrepeat', 'email')
        widgets = {
            'password' : PasswordInput(),
            'passwordrepeat' : PasswordInput(),
        }
Run Code Online (Sandbox Code Playgroud)

views.py:

def register(request):
    flag = True
    possible = '0123456789abcdefghijklmnopqrstuvwxyz'
    token = ''
    length = 10
    i = 0

    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']

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

        elif password == passwordrepeat:
            while i<10:
                temp = random.choice(possible)
                token = token + temp
                i=i+1

            userf.email_token = token
            userf.email_token_expiry = current_datetime + timedelta(1)
            userf.save()
            return HttpResponseRedirect('/')
    else:
        return render_to_response('register.html', {"user": user, 'flag': True}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

在模板中:

<div id="id_div_register">
    <form action="/register" method="POST">{% csrf_token %}
        {{ user.as_p }}
        <input type=submit value="Submit" />
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

由于models.py中的字段,此表单会创建一个文本框'repeatpassword'.我不想在mysql表字段/列中有一个字段'repeatpassword'.但我需要在模板中比较'password'和'repeatpassword'.我该怎么做?

我需要在模板中使用'password'和'repeatpassword'来比较这两个,但我不需要blog_users mysql表中的列/字段'repeatpassword'.我该怎么做?有可能做到这一点.

Dan*_*man 13

你绝不能永远不要这样做.

您将用户的密码以明文形式存储在数据库中.你不能这样做.

Django有一个完整的内置身份验证框架,它负责妥善存储密码所需的所有安全性,包括散列.用它.它并不复杂,实际上比滚动自己更容易.

摆脱你的不安全版本并使用Django.

  • 这个评论与我的答案有什么关系?不要创建用于存储密码的不安全系统.使用Django的.如果您需要在顶部放置注册机制,请使用[django-registration](https://bitbucket.org/ubernostrum/django-registration)之类的内容. (3认同)
  • 我相信当你告诉他们他们被黑客攻击时你的客户会很高兴因为你喜欢把你自己的系统放在一起,而不是花时间阅读有关如何正确操作的文档. (3认同)

Jam*_*esO 7

您需要清理表单上的新字段以检查密码是否匹配,然后您可以删除视图中的密码检查并替换为form.is_valid().类似于以下内容:

class UsersModelForm(forms.ModelForm):
    passwordrepeat = forms.PasswordInput()
    class Meta:
        model = Users

    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
Run Code Online (Sandbox Code Playgroud)