본문 바로가기
Python/Django Ⅲ

(Review) Django Form

by Mr.DonyStark 2024. 5. 27.

□ Django Form을 활용해 사용자로부터 값을 받고 저장하는 기능을 구현하자

my_site라는 프로젝트, cars 라는 앱을 생성 후 앱내 model과 forms, urls, views, template 파일을 생성했음

  ● app > models.py

from django.db import models

class Review(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    stars = models.IntegerField()

 

  ● app > forms.py

   ○ model 연결 : models.py에서 생성한 클래스명 지정

   ○ fields : 값을 받을 필드를 커스터마이징하거나 모두 불러올수 있음

   ○ labels : 받을 필드별 라벨링을 지정

from django import forms
from django.forms import ModelForm
from .models import Review

class ReviewForm(ModelForm):
    class Meta:
        model = Review
        fields = "__all__" #모든 속성을 가져옴
        labels ={
            "first_name" : "Your FirstName",
            "last_name" : "Last Name",
            "Stars" : "Rating"
        }
        # fields = ["first_name", "last_name", "stars"] #커스터마이징으로 특정필드가져옴

#form 클래스 생성
#속성과 라벨은 한쌍으로 생성
# class ReviewForm(forms.Form):
#     first_name = forms.CharField(label="First Name", max_length=100)
#     last_name = forms.CharField(label="Last Name", max_length=100)
#     email = forms.EmailField(label="E-Mail")
#     review = forms.CharField(label="Please write yout review here",
#                              widget=forms.Textarea())

 

  ● app > views.py

   ○ 사용자로부터 form 을 통해 받은 데이터를 POST 방식으로 처리할 경우 유효성 검사후 저장. 저장 및 등록 후 redirect를 활용해 thank name을 가진 url 반환

   ○ html 반환, 즉 render를 위해 render 호출 및 redirect 사용

from django.shortcuts import render, redirect
from django.urls import reverse
from .forms import ReviewForm

# Create your views here.
def rental_review(request):
    #post request > form contents > thank you
    if request.method == "POST":
        form = ReviewForm(request.POST)
        #유효성검사
        if form.is_valid():
            print(form.cleaned_data) #딕셔너리형태로 보여줌 cleaned_data
            form.save()
            return redirect(reverse("cars:thank")) #redirect와 reverse는 함꼐사용
    else:
        #리뷰등록 폼
        form = ReviewForm()
        return render(request,"cars/rental_review.html", context={"form":form})

def thank_you(request):
    return render(request,"cars/thank_you.html")

 

  ● app > urls.py

from django.urls import path
from . import views

app_name = "cars"

urlpatterns = [
    path("rental_review/", views.rental_review, name="rental"),
    path("thank_you/", views.thank_you, name="thank")
]

 

  ● Template

    ○ reantal_review : form을 활용해 데이터를 받는 페이지 {{form} 활용

{% load static %}
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>기본 HTML 문서</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="{% static "cars/custom.css" %}"
</head>
<body>
    <h1>Welcome to rental review</h1>
    <div class="container myform">
        <form method="POST">
            {% csrf_token %}
            {{form.as_ul}}
                <!--{{form.as_p}}, {{form.as_ul}}-->
                <!--특정 필드만 할시 {{form.first_name.labeltag}}{{form.first_name}}-->
            {{form.errors}}
            <input type="submit">
        </form>
    </div>
</body>
</html>

 

    ○ thank_you

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>기본 HTML 문서</title>
</head>
<body>
    <h1>Welcome to thank you</h1>
</body>
</html>

 

 결과

Form 태그를 뿌려줌
값 입력 후 제출을 하면 우측페이지와 같이 전환
view 에서 form.cleaned_data를 활용해 위와 같이 데이터가 POST방식으로 서버에 전달되는 것을 확인