[컴][웹] django 에서 user 등록 화면

장고에서 user creation form / user register / user registration form


UserCreationForm 사용

ref. 2 에 나온 방법으로 form 을 만들면 아래와 같다. 요약하면,

  1. /register url 로 들어가면, POST 가 아닌 경우에, user 등록화면이 나오게 되고, 
  2. 값을 입력하고 submit 을 하면
  3. /register 로 결과를 전송하게 된다. 
  4. /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

  1. python - Creating Custom user registration form Django - Stack Overflow : 새로운 UserCreationForm 을 만들어서 사용하는 방법
  2. http://stackoverflow.com/a/17005485 : django 의 CreateView 와 UserCreationForm 을 이용하는 방법
  3. 8. User Authentication — How to Tango with Django 1.5.4 : 오래된 내용이지만, 참고할 만 하다.
  4. Form handling with class-based views | Django documentation | Django
  5. Creating forms from models | Django documentation | Django


댓글 없음:

댓글 쓰기