UserCreationForm 사용
ref. 2 에 나온 방법으로 form 을 만들면 아래와 같다. 요약하면,- /register url 로 들어가면, POST 가 아닌 경우에, user 등록화면이 나오게 되고,
- 값을 입력하고 submit 을 하면
- /register 로 결과를 전송하게 된다.
- /register 에서 user 정보를 확인하고, 저장하게 된다.
이렇게 하면 id/pw 를 입력 받고, submit 하면, error 검사까지 해주는 register 화면이 완성된다. 예쁘게 꾸미는 것은 알아서 하면 된다.
urls.py
from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm
urlpatterns = [
url('^register/', CreateView.as_view(template_name='signup.html',
form_class=UserCreationForm,
success_url='/'), name='signup'),
]
signup.html
<form class='signup-form' method='post' action=''>
{% csrf_token %}
{{ form }}
<input type='submit'/>
</form>
views.py
만약 CreateView 를 상속받아서 자신의 view 를 만들고 싶다면 아래처럼 하면 된다. 위의 CreateView.as_view(...) 부분과 비교하면서 보면 된다.class SignUpView(CreateView):
template_name = "signup.jade"
form_class = UserCreationForm
success_url = '/'
def get_context_data(self, **kwargs):
context = super(SignUpView, self).get_context_data(**kwargs)
return context
form.py
UserCreationForm 을 상속받고, 새로운 Form class 를 만들어서 사용할 수도 있다. 기본적으로 UserCreationForm 이 user / password 만 입력받는 간단한 form 이기 때문에 이부분을 보완해서 만들 수 있다.Meta.fields 는 db 에 저장될때 저장되는 녀석을 설정하는 것이다.
- 아래 code 처럼 .save() 이후에 설정하는 경우가 아니라면, fields 에 적혀있지 않다면, db 에 저장되지 않는다.
- 그리고 아래처럼 field 가 새롭게 정의된 것이 아니라면, fields 에 적혀있는 녀석만 page 에 보여진다.
- fields 에 적혀진 녀석은 request 때에 parameter 로 값이 와야 한다. 즉 request 를 받을 때 parameter 를 check 하고 싶은 값은 아래처럼 field 에 추가해야 한다.
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
class UserRegistrationForm(UserCreationForm):
first_name = forms.CharField(required = False)
last_name = forms.CharField(required = False)
birthday = forms.DateField(required = False)
class Meta:
model = User
fields = ('username', 'password1', 'password2', 'first_name')
def save(self,commit = True):
user = super(UserRegistrationForm, self).save(commit = False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.birthday = self.cleaned_data['birthday']
if commit:
user.save()
return user
추가적인 user 정보
그것이 아니라 아예 새로운 user 정보, 즉 auth_user table 이외의 정보를 추가하고 싶은 경우에는 새로운 table 과 그에 따르는 Form class 를 만들면 된다. 이부분에 대해서는 ref. 3 을 참고하면 된다.Validation
Ajax
Clinet
signup 화면은 여기 화면을 사용했다. 이 화면에서 js 부분을 아래 code 로 대체하면, register-button 을 누를 때 ajax 로 register 요청을 할 수 있다. 물론 csrf token 도 같이 포함한다.Server
urlpatterns = [
url(r'^login/$', SignUpView.as_view(), name='login'),
url(r'^register-action/$', RegistrationView.as_view(), name='register_action'),
]
class SignUpView(TemplateView):
template_name = "signup.jade"
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
context.update(csrf(request))
return self.render_to_response(context)
def get_context_data(self, **kwargs):
context = super(SignUpView, self).get_context_data(**kwargs)
return context
Django Rest Framework
여기서는 register-action 을 위해서 djangorestframework 를 사용했다.class RegistrationView(APIView):
"""
"""
authentication_classes = (CsrfAuthentication,)
permission_classes = (AllowAny,)
def post(self, request):
"""
:param request:
:return:
"""
login_form, registration_form = False, False
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/admin')
return Response(status=status.HTTP_406_NOT_ACCEPTABLE, data=err(form.errors))
CsrfAuthentication 은 단순히 csrf 만을 check 하기 위해서 만들었다. SessionAuthentication 에서 csrf 체크 부분만 가져왔다.
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication, CSRFCheck
__author__ = 'namh'
class CsrfAuthentication(BaseAuthentication):
"""
Check only Csrf token
"""
def authenticate(self, request):
"""
Returns a `User` if the request session currently has a logged in user.
Otherwise returns `None`.
"""
self.enforce_csrf(request)
# CSRF passed with authenticated user
return ({}, None)
def enforce_csrf(self, request):
"""
Enforce CSRF validation for session based authentication.
"""
reason = CSRFCheck().process_view(request, None, (), {})
if reason:
# CSRF failed, bail with explicit error message
raise exceptions.PermissionDenied('CSRF Failed: %s' % reason)
Reference
- python - Creating Custom user registration form Django - Stack Overflow : 새로운 UserCreationForm 을 만들어서 사용하는 방법
- http://stackoverflow.com/a/17005485 : django 의 CreateView 와 UserCreationForm 을 이용하는 방법
- 8. User Authentication — How to Tango with Django 1.5.4 : 오래된 내용이지만, 참고할 만 하다.
- Form handling with class-based views | Django documentation | Django
- Creating forms from models | Django documentation | Django
댓글 없음:
댓글 쓰기