在Django中填充表单后如何更改其数据

时间:2019-11-03 20:13:35

标签: django django-forms

这可能是重复的,但是我尝试了很多解决方案,但没有一个对我有用。

views.py

class signup_view(View):
def get(self, request):
    signup_form = SignUpForm()
    return render(request, 'signup.html', {"forms": signup_form})

def post(self, request):
    signup_form = SignUpForm(data=request.POST)
    if signup_form.is_valid():
        email = signup_form.cleaned_data.get('user_email')
        password = signup_form.cleaned_data.get('user_pass')
        print("Original password is: ", password)
        hashed_password = make_password(password)
        print("Hashed password is: ", hashed_password)
        signup_form.inital['user_pass'] = hashed_password 
        signup_form.save()
        request.session['username'] = email
        return render(request, 'main_page.html')
    else:
        return render(request, 'signup.html', {"forms": signup_form})

我有这个django视图,我用发布请求中的信息填充了该视图,但是,我需要确保密码和密码确认(在表单中)都相同,以便进行操作,我可以这样做在clean()函数中,我将在下面发布。但是,我需要将散列密码保存在我的数据库中,而不是实际的密码上,并且我不知道在我已经确认它是有效的之后该如何更改表单的内容(不确定是否可以这样做)。

class SignUpForm(forms.ModelForm):
user_pass_check = forms.CharField(label="Password confirmation", widget=forms.PasswordInput())
class Meta:
    model = AppUser
    fields = ["user_email", "user_country", "user_pass"]
    widgets = {"user_pass": forms.PasswordInput()}

def clean(self):
    cleaned_data = super(SignUpForm, self).clean()
    pass1 = cleaned_data.get('user_pass_check')
    pass2 = cleaned_data.get('user_pass')
    if pass1 != pass2:
        raise forms.ValidationError("The two password fields must match.")
    return cleaned_data

任何帮助都将是惊人的,花了好几个小时苦苦挣扎。 预先感谢!

1 个答案:

答案 0 :(得分:2)

这不是方法。相反,通过保存commit = False来获取模型对象,然后在保存为真实对象之前在该对象上设置密码。

struct UserService: Codable {
    let id: Int
    let name: String?
    let company: Company?

    struct Company: Codable {
        let name: String?
    }
}

struct User {
    let id: Int
    let name: String?
    let companyName: String?

    init(from service: UserService) {
        id = service.id
        name = service.name
        companyName = service.company?.name
    }
}

但是,我希望您不要自己进行身份验证。即使您正确地对密码进行哈希处理,这也是绝对不能的事情。身份验证还涉及许多其他安全陷阱,并且Django已经对其进行了测试。不要这样使用内置的身份验证框架,并在需要时替换您自己的User对象。