2014-09-30 2 views
3

해시 된 버전의 사용자 비밀번호를 저장하려고했지만 작동하지 않습니다.Django에서 해시 된 버전의 해시 된 버전이 작동하지 않음

forms.py :

class up_form(forms.ModelForm): 
    class Meta: 
     model = Users 
     fields =['email', 'password', 'username', 'status'] 

views.py :

from myapp.forms import up_form 
from django.contrib.auth.hashers import make_password 
def register(request): 
    if request.method == 'POST': 
     sign_up = up_form(request.POST or None) 
     if sign_up.is_valid(): 
      sign_up.password = make_password(sign_up.cleaned_data['password']) 
      sign_up = sign_up.save(commit = False) 
      sign_up.status = 1 
      sign_up.save() 

하지만 내 password 여전히 일반 텍스트로 저장하세요. 이 문제를 어떻게 해결할 수 있습니까?

답변

6

개체의 이름을 양식 자체와 동일하게 지정했기 때문에 명령문의 순서를 전환해야합니다.

if request.method == 'POST': 
    sign_up = up_form(request.POST) 
    if sign_up.is_valid(): 
     sign_up = sign_up.save(commit = False) 
     sign_up.password = make_password(sign_up.cleaned_data['password']) 

또한이 메소드의 응답을 반환하고 POST 요청 후 사용자를 적절하게 리디렉션하기를 바랍니다. 장고의 원래 UserCreationForm이 무엇을 따라 양식의 save 메소드를 오버라이드 (override) 할

def register(request): 
    form = up_form(request.POST or None) 
    if form.is_valid(): 
     sign_up = form.save(commit=False) 
     sign_up.password = make_password(form.cleaned_data['password']) 
     sign_up.status = 1 
     sign_up.save() 
     return redirect('/thank-you/') 
    return render(request, 'sign_up_form.html', {'form': form}) 
+0

이것은 'AttributeError at/myapp/register/ '을 반환합니다. 사용자의 객체에는 'cleaned_data'속성이 없습니다. – Yax

+0

죄송합니다. 지금 사용해보세요. –

+0

효과가있었습니다! 고맙습니다. – Yax

1

가장 좋은 방법은 다음과 같습니다 :

이 버전을 고려

class UpForm(forms.ModelForm): 
    class Meta: 
     model = Users 
     fields =['email', 'password', 'username', 'status'] 

    def save(self, commit=True): 
     user = super(UpForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password"]) 
     if commit: 
      user.save() 
     return user 

당신이 make_password()에없는이 방법 모든보기에서 양식을 사용합니다.

+0

UserCreationForm의 서브 클래스가 아닌 이유는 무엇입니까? – kakarukeys

+0

OP는 그가 사용자를 만들고 있다고 말하지 않았습니다. 보기에 if 문을 중첩하는 대신 양식 클래스에 처리를 남기는 것이 좋습니다. – jhnwsk