Django 12. 폼

 Django 12. 폼


Django는 폼을 보다 쉽게 작성하기 위한 forms 제공



1. 폼 클래스 생성


앱 폴더 안에 form.py 파일 생성

django의 forms 임포트

forms.Form을 상속받는 폼 클래스 생성

클래스 내부에 입력받을 항목에 대한 필드 정의 -> model과 유사


* 예시

from django import forms

class SurveyForm(forms.Form):
user_name = forms.CharField(label="Your name", max_length=100)
user_age = forms.IntegerField(label="Your age")

label 속성은 해당 항목에 표시될 내용






2. 폼 로직 처리


urls.py 파일에 폼과 연결된 경로 추가


* 예시

urlpatterns = [
...

path("survey/", views.survey, name="survey"),
path("thsnks/", views.thanks, name="thanks"),
]



views.py에 처리하는 함수 정의

form.py의 폼 클래스 임포트

GET 요청인 경우 폼 클래스의 인스턴스를 생성해서 (매개변수로 아무것도 전달 안함) 파라미터로 전달


POST 요청인 경우 폼 클래스의 인스턴스를 생성(매개변수로 request.POST 전달)

폼 인스턴스의 is_valid() 함수를 이용해서 유효성 검사 -> 모든 항목에 정상적으로 값이 다 들어왔으면 True 반환

폼 인스턴스의 cleaned_data[label값]를 이용해서 해당 항목의 값을 받아올 수 있음



* 예시

from .form import SurveyForm

def survey(request):
if request.method == "POST":
form = SurveyForm(request.POST) # 넘어온 데이터를 폼에 넘겨줌

if form.is_valid(): # 데이터 검증. 모든 데이터가 잘 들어갔는지
# 들어간 데이터 확인하기
print(form.cleaned_data["user_name"])
print(form.cleaned_data["user_age"])

return HttpResponseRedirect(reverse("polls:thanks"))
else:
form = SurveyForm()
return render(request, "polls/survey_custom.html", {"form":form})

def thanks(request):
return render(request, "polls/thanks.html")






3. 폼 탬플릿 구현


템플릿의 <form> 태그 안에 {{ form }} 추가

{{ form }} 부분에 폼 클래스에 정의한 내용이 자동으로 구현됨


* 예시

<form action="{% url "polls:survey" %}" method="POST">
{% csrf_token %}
{{ form }}

<input type="submit" value="Submit">

</form>








* 폼 커스텀


{{ form }} 에 코드를 추가해서 폼을 커스텀 할 수 있음


- .as_[태그] 

해당 태그로 폼의 항목들을 감쌈

as_p, as_div, as_ul 등


* 예시 - ul 태그로 감싸기

<form action="{% url "polls:survey" %}" method="POST">
{% csrf_token %}

{{ form.as_ul }}

<input type="submit" value="Submit">
</form>








- 특정 항목만 출력

{{ form.[ 필드 이름 ] }} 를 이용하면 클래스에 구현한 필드 중 원하는 내용만 출력 가능

{{ form.[ 필드 이름 ].label_tag }} 를 이용하면 해당 요소의 label 출력


* 예시

<form action="{% url "polls:survey" %}" method="POST">
{% csrf_token %}

{{ form.user_name.label_tag}} {{ form.user_name }}

<input type="submit" value="Submit">
</form>








* 폼의 요소에 class 적용하기

css 스타일 적용을 위해 폼에 class를 지정할 수 있음

form.py 파일에서 폼 클래스의 필드를 정의할 때 Field 의 widget 속성을 통해 지정할 수 있음

forms.[widget 종류](attrs={"class" : "[ 클래스 이름 ]")


- widget 종류

TextInput, NumberInput, EmailInput, URLInput, PasswordInput, HiddenInput, DateInput, DateTimeInput 등


* 예시

class SurveyForm(forms.Form):
user_name = forms.CharField(label="Your name", max_length=100,
widget=forms.TextInput(attrs={"class":"form-control"}))
user_age = forms.IntegerField(label="Your age",
widget=forms.TextInput(attrs={"class":"form-control"}))






4. 모델 폼


DB와 폼을 쉽게 연결할 수 있도록 해주는 모델 폼 제공


* model.py 에 새로운 테이블 클래스 정의

class Survey(models.Model):
user_name = models.CharField(max_length=20)
user_age = models.IntegerField(default=0)

def __str__(self):
return f"{self.user_name}--{self.user_age}"




django.forms 의 ModelForm 임포트해서 ModelForm을 상속받는 폼 클래스 생성

내부 클래스 Meta를 정의해서 모델에 대한 정보를 작성 -> 해당 모델과 자동 맵핑됨


* Meta 클래스의 멤버 변수

model : 맵핑할 모델 클래스

fields : 폼으로 만들 컬럼명을 문자열 리스트로 작성. 폼을 만들지 않을 컬럼은 작성하지 않아도 됨. "__all__"을 할당하면 자동으로 모든 컬럼에 대해서 폼 생성

labels : 각 컬럼의 라벨을 딕셔너리 형식으로 할당

widget : django.forms의 TextInput, NumberInput 등의 위젯을 임포트 해서 해당 컬럼의 클래스 지정. 딕셔너리 형식으로 할당


* 예시

from django.forms import ModelForm, TextInput, NumberInput
from polls.models import Survey

class SurveyForm(ModelForm):

# 모델과 맵핑
class Meta:
model = Survey # 맴핑할 모델 클래스
# fields = "__all__"
fields = ["user_name", "user_age"] # 폼으로 만들 컬럼 리스느

# 각 컬럼의 라벨
labels = {
"user_name" : "Your name",
"user_age" : "Your age"
}

# 각 컬럼의 클래스 지정
widget = {
"user_name" : TextInput(attrs={"class":"form-control"}),
"user_age" : NumberInput(attrs={"class":"form-control"})
}



* INSERT

폼으로부터 데이터를 받아서 is_valid 함수로 유효성을 검사하고 폼 인스턴스의 save() 함수를 호출하면 자동으로 DB에 해당 값이 저장됨


def survey(request):
if request.method == "POST":
form = SurveyForm(request.POST) # 넘어온 데이터를 폼에 넘겨줌

if form.is_valid(): # 데이터 검증. 모든 데이터가 잘 들어갔는지
# 데이터를 DB에 저장
form.save()



* UPDATE

업데이트할 데이터를 불러오고 모델 폼 클래스 생성자의 instance 매개변수로 넘겨줘서 모델 폼 인스턴스를 생성

모델 폼 인스턴스의 save() 함수를 호출해서 해당 데이터를 업데이트


# 업데이트할 데이터
survey = Survey.objects.get(pk=1)
# 해당 데이터 업데이트
form = SurveyForm(request.POST, instance=survey)
# DB에 저장
form.save()










댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동