2010년 6월 7일 월요일

12 - 1) 사용자 등록하기

앞선 django Form을 이용하여 새로운 사용자를 등록하여 봅시다.

 

Application에 registrationForm.py라는 파일 만들고 다음과 같이 입력합니다.

 

  1. from django import forms

    class RegistrationForm(forms.Form):
       username = forms.CharField(label='Username', max_length=30)
       email = forms.EmailField(label='e-mail')
       password1 = forms.CharField(label='Password', widget=forms.PasswordInput())
       password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput())

 

입력된 코드는 사용자 등록을 위한 Form을 생성하기 위해 django에서 제공하는 Form 기능을 이용하기 것입니다.

코드를 살펴보시면 아시겠지만 사용자 등록에 필요한 사용자의 입력은 사용자명, 이메일, 암호입력, 암호 확인의 4가지입니다.

암호 입력을 위한 Form 필드 생성시 forms.PasswordInput()을 widget의 속성값으로 사용하여 암호 입력 필드로 만들고 있음을 잘 보시기 바랍니다.

위의 사용자 입력 폼 생성 코드를 shell에서 확인해 봅시다.

 

> python manage.py shell
>>> from myTest.registrationForm import *
>>> user = RegistrationForm({
... 'username' : 'test2',
... 'email' : 'abc@def.com',
... 'password1' : 'test123',
... 'password2' : 'test123'
... })
>>> user.is_valid()
True

 

잘 사용됨을 알 수 있습니다. 만일 여기서 이메일 입력하는 부분에 이메일 형태와 다른 값을 입력하면 어떻게 될까요?

다음 예를 살펴보겠습니다.

 

>>> user2 = RegistrationForm({
... 'username' : 'test3',
... 'email' : 'abcdef ghijkl',
... 'password1' : 'test123',
... 'password2' : 'test123'
... })
>>> user2.is_valid()
False

 

유효하지 않음을 알 수 있습니다. 유효하지 않다는 것은 Form에 사용자 입력이 잘못되었다는 것을 뜻하는 데 어떤 오류가 있는지 확인해 보겠습니다.

 

>>> user2.errors
{'email': [u'Enter a valid e-mail address.']}

 

이메일 필드의 입력이 잘못되었으며 이메일 형식이 아닌 입력임을 알 수 있습니다.

 

 

다음으로 입력값에 대한 확인을 하기 위한 메소드를 추가해 보도록 하겠습니다.

입력값 확인은 다음의 두가지입니다.

  • 입력받은 두개의 비밀번호가 일치하는지 검사 (is_valid_password2())
  • username이 올바른지, 이미 사용되고 있는지는 아닌지 검사 (is_valid_username())

 

각각에 대해 위에서 작성한 registrationForm.py에 추가해 주시기 바랍니다.

 

  1. import re
    from django.contrib.auth.models import User
    from django.core.exceptions import ObjectDoesNotExist
  2.  
  3. class registrationForm(self) :
  4. ...
  5.     def is_valid_password2(self):
           if 'password1' in self.cleaned_data:
               password1 = self.cleaned_data['password1']
               password2 = self.cleaned_data['password2']
               if password1 == password2 :
                   return password2
               raise forms.ValidationError('입력한 패스워드가 일치하지 않습니다.')
         
       def is_valid_username(self):
           username = self.cleaned_data['username']
           if not re.search(r'^\w+$', username):
               raise forms.ValidationError('username은 알파벳, 숫자, 밑줄(_)만 가능합니다.')
           try:
               User.objects.get(username=username)
           except ObjectDoesNotExist:
               return username
           raise forms.ValidationError('이미 사용중인 username입니다.')


앞서 설명드린 내용을 참고하시면 is_valid_password2()는 쉽게 이해하시리라 믿습니다...제발...

두번째 정의한 메소드에서 re.search(r'^\w+$', username) 는 정규표현식에 대한 검색 함수입니다(import re). 이 함수는 username에서 단어가 한개 이상 등장하면 true를 반환입니다. 단어를 구성하는 문자는 알파벳, 숫자, 밑줄(_)로써 이 세가지 이외의 문자가 username에 있으면 False를 반환합니다. False를 반환할 경우 ValidationError() 예외를 발생시켜(raise) Form으로 되돌아 갈 수 있도록 합니다.

그외 나머지 부분도 이해하시는데 큰 어려움은 없으리라 다시 한번 착각에 빠져봅니다.

 

RequestContext의 사용 (http://docs.djangoproject.com/en/dev/ref/templates/api/#id1)

앞선 11. 페이지 개선의 학습활동에 문제점과 해결책을 말씀드렸습니다.

이제 RequestContext의 사용법을 알아보도록 하겠습니다.

RequestContext 객체는 일반 Context와는 조금 달라서 별도로 지정하지 않아도 자동으로 user 객체를 전달합니다.

따라서 별도의 user 객체를 연결시키지 않더라도 request객체와 템플릿 변수들로 RequestContext 를 만들 수 있습니다.

site_main과 userHomepage 뷰를 수정해 보겠습니다.

 

  1. views.py
  2. from django.template import RequestContext
  3.  
  4. def site_main(request) :
  5. return render_to_response('index.html', RequestContext(request))

  6.  
  7. def userHomePage(request, username):
       if request.user.is_authenticated() :
           try :
               user = User.objects.get(username=username)
           except :
               raise Http404('사용자를 찾을 수 없습니다.')
         
           variables =RequestContext(request, {'username' : username})
           return render_to_response('userHome.html', variables)
       else :
           return HttpResponseRedirect('/accounts/login/')

 

 

사용자 등록 폼이 사용할 템플릿 페이지를 작성해 봅시다.

프로젝트/template/registration/register.html로 다음을 작성합시다.

 

  1. template/registration/register.html

    {% extends "base.html" %}
    {% block title%}사용자 등록 페이지{% endblock %}
    {% block head%}사용자 등록을 합니다.{% endblock %}
    {% block content%}
    <form method="post" action=".">
       {{ form.as_p }}
       <input type="submit" value="가입" />
    </form>
    {% endblock %}

 

 

{{ form.as_p }} 부분에 우리가 작성한 django Form을 사용한 Form 코드가 들어갑니다. 여기서 한가지 주의할 것은 이름이 form.as_p 이므로 이 template과 들어갈 내용을 결합할 때 우리가 작성한 form 코드가 변수명 form으로 결합되어야 합니다. 이를 위한 view 코드가 아래에 나오는데 이 부분을 잘 살펴주시기 바랍니다.

 

  1. views.py

  2. from webDB.myTest.registrationForm import *

  3.  

  4. def register_page(request):
       if request.method == 'POST':
           form = RegistrationForm(request.POST)
           if form.is_valid():
               user = User.objects.create_user(
                                               username=form.cleaned_data['username'],
                                               password=form.cleaned_data['password1'],
                                               email=form.cleaned_data['email']
                                               )
               return HttpResponseRedirect('/')
       else :
           form = RegistrationForm()
       variables = RequestContext(request, {'form': form})
       return render_to_response('registration/register.html', variables)

 

 

이 뷰를 위한 url 세팅은 다음과 같습니다.

 

  1. urls.py

  2. ...

  3.     (r'^register/$', register_page),

  4. ...

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기