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
댓글 없음:
댓글 쓰기