본문 바로가기
Django 탐험기

[Django] Form안의 여러 함수들에 대해 - 로그인 기능을 통해

by 코딩균 2021. 1. 13.

Form 안에서 사용가능한 여러가지 함수? method라고 해야 하나???

명칭에 약하다 나중에 명칭공부를 해야겠지만 그냥

method라고 할란다

attribute들도 많다

 

cleaned_data, is_valid(), clean 등등 

 

뭐가 뭔지 어떠한 기능을 하는지 모르고 그냥 가져다가 썼는데 

장고 Document를 보면서 각가 어떤 기능을 가지는 알아보았다

 

* 코딩균의 개발 공부를 뇌에 정리하기 위한 포스팅이며 틀린 점이 있다면 거칠게 댓글에 피드백 부탁드립니다

 

시작

from django import forms

forms api를 임포트 해주고

class LoginForm(forms.Form):
    username = forms.CharField(label="아이디", max_length=100)
    password = forms.CharField(widget=forms.PasswordInput)

#forms.py 에 선언된 form class

 

사용자가 입력할 input 들을 만들어준다

 

사용자는 프론트 엔드의 html form을 통해 인코딩 된 data들을 보내고

 

각 인코딩 된 데이터들이 저기 선언된 필드에 착륙하는 시스템인 것 같다

 

form.is_valid()

form 안의 각 필드에 들어와 계신 데이터들이 모두 필드에 적합한 data들인지 

 

시찰 한번 쭈욱 도신 다음에 다 오케이라면 

 

1. True를 반환

2. cleaned_data 속성에 data들을 배치한다

 

view에서 is_valid()를 사용하여 정보들을 사용할 수 있도록 cleaned_data로 뽑아준다

class Login(View):

    def get(self, request):
        form = LoginForm()
        ctx = {
            'form':form,
        }
        return render(request, "users/login.html", ctx)
    
    def post(self, request):
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(user)
                return redirect(reverse("core:main"))
        ctx={
            'form':form,
        }
        return render(request, "users/login.html", ctx)
   

위는 클래스 기반의 view이다

 

get의 형태로 request를 보낸다면

      즉 우리가 처음 로그인 페이지에 들어갔다면

 

class view은 get 함수를 사용하여서 form을 만들어주고 

 

그것을 context로 템플릿에 넘겨준다!

 

post의 형태로 request가 들어왔다면

      즉 우리가 로그인 페이지에서 아뒤 비번을 입력하고 로그인 버튼을 눌렀다면

 

request.POST를 인자로 받은 폼을 만들어서 

       : binding data to the form 데이터를 폼에 바인딩 한다고 doc은 설명한다

                  -> 이때 아마 인코딩 된 정보들이 장고의 폼에 들어가는 것이 아닌가 싶다

 

이 놈의 폼이 올바른 정보를 담고 있는지 점검한 후에!

 

옳다구나! 올바른 정보들이 사용자로부터 브라우저가 인코딩하여서 필드 안에 잘 넣어놨구나!

 

라는 것을 깨닫는다면 cleaned_data라는 곳에 우리가 사용할 수 있게 스르륵 넣어준다

 

만약! is not valid하다면??

 

다시 원래 정보들이 입력되어 있는 폼이 있는 템플릿으로 돌아간다!!

 

form = Loginform(request.POST)

이 form이 ctx를 통해 template으로 넘어갔으니까 

 

내가 쓴 정보 그대로 다시 알맞은 정보로 수정할 수 있는 것이다

 

 

 

form.cleaned_data

데이터들이 form에 바인딩되고 

 

is_valid()가 작동되어서 validation검사를 쭈욱 마치고 나오면

 

딕셔너리 형식의 파이썬 타입으로 convert되는 데 그것이 바로 cleaned_data이다!

      doc에 따르면 request.POST.get("") 이렇게 data에 접근하는 방식도 있으나 사실 이미 적합성 검사를 마친

            cleaned_data를 쓰는 것이 더 적합하다

 

 

 

 

 

 

참고자료 | docs.djangoproject.com/en/3.1/topics/forms/

'Django 탐험기' 카테고리의 다른 글

[Django] Form : Http method - GET, POST란???  (0) 2021.01.12
[Django] 웹 개발 환경 세팅하기  (0) 2021.01.11