2012-01-17 3 views
0

models.py : 템플릿에서사용하여 템플릿의 비밀번호 입력 필드를 가져올 수 없습니다 ModelForm

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 

은 내가 템플릿의 passwordrepeat 입력 필드를 얻을 수

username 
password 
email 

를 얻을. 어떻게 'passwordrepeat'필드에 레이블을 설정할 수 있습니까? 레이블은 Repeat Password

def cleanUsersModelForm에서 생략 할 수 있습니다. 나는 views.py에서 passwordrepeatpassword을 models.py와 비교하고 싶지 않습니다.

views.py :

def register(request): 
    flag = True 
    possible = 'abcdefghijklmnopqrstuvwxyz' 
    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', '[email protected]', '[email protected]' 
       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)) 
+0

하면 해당보기를 dpaste 수있는 형태? – Jingo

+0

왜 당신은 views.py가 필요합니까? – shibly

+0

원래 게시물을 업데이트했습니다. 다시 한번 그 점을 이해하십시오. – shibly

답변

5

정답 : django-registration를 사용합니다. 그리고 장고 내장 인증 시스템. 바퀴를 재발 명하지 마십시오.

은 (는) 필드가 아니기 때문에 passwordrepeat을 볼 수 없습니다. 위젯입니다. 필드가 없으면 위젯을 렌더링 할 수 없습니다. CharFieldPasswordInput을 사용해야합니다. 레이블을 설정하려면 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 ... 
+0

예, 지금은 'passwordrepeat' 필드를 가지고 있지만, fiedls의 순서는''1) username''2) password 3) email 4) passwordrepeat'입니다. 이 형식으로 시퀀스를 만들려면 어떻게해야합니까? 'username ','password ','passwordrepeat ','email ']''사용자 이름 2) 암호 3) passwordrepeat 4) email' – shibly

+0

@ 구루'self.fields.keyOrder = 재정의 된'__init__'에 배치하십시오. – DrTyrsa

+0

이 줄을 추가 할 위치는 어디입니까? 'self.fields.keyOrder = [ 'username', 'password', 'passwordrepeat', 'email']'? – shibly

관련 문제