dev/Django

[Django]Forms.py (+ CSRF 설명)

mingracle 2022. 2. 6. 00:11

간단한 Form을 만들때 forms.py를 따로 만들어 사용이 가능

but. Form으로 작성하면 models.py, forms.py를 따로 관리해야하기 때문에 번거롭다.

 

- forms.py -

from django import forms #django안에 forms라는 프레임워크가 따로 존재한다.

class ResForm(forms.Form):
    title = form.CharField(label='타이틀',  max_length=50)
    con = form.CharField(label='내용', widget=forms.Textarea) # CharField의 기본설정은 input type = "text" 
        # textarea: 텍스트 영역 정의
        # models.py에서의 con = models.TextField()과 같이 사용하거나 widget을 이용해도 된다.

 

- views.py -

from django.shortcuts import render
from .forms import ResForm

def sub(request):
    form = ResForm()
    return render(request, 'two/sub.html', {'form':form}) # form의 이름을 'form'으로 한다

 

- sub.html -

<form action ="{% url 'sub' %}" method ="post"> <!--post방식으로 보내줌-->
    {% csrf_token %} <!--인증-->
    {{form}}
</form>

{% csrf_token %}

  : 해당 post요청에 대해 csrf token을 발급받고 체크해주도록 한다.

 

- urls.py에 url경로 추가 -

path('sub/', views.sub, name='sub'),

 

화면 출력 결과 http://127.0.0.1:8000/sub/


CSRF(Cross Site Request Forgery)

 1. 사용자가 페이지에 접속하면 장고에서 자동으로 csrf_token을 사용자에게 보내 cookie에 저장

 2. 사용자가 form을 입력한 후 submit버튼을 누른다.

 3. formcookie csrf_token을 같이 post로 전송한다.

 4. 전송된 token유효성 검증

 5. token이 유효하지 않으면 검증오류 403error 발생