영벨롭 개발 일지

[Django]장고에서 사용자 입력받기 - Form 이용하기 본문

Back-end/Django

[Django]장고에서 사용자 입력받기 - Form 이용하기

영벨롭 2022. 5. 18. 16:10

[ Django에서의 Form ]

 

 장고에서는 사용자가 입력을 하게되면 그 입력에 대한 처리를 할 수 있드록 폼 기능을 제공합니다. 

 

 models.py의 모델 클래스의 필드가 데이터베이스 필드에 매핑되는 것처럼, 폼 필드의 클래스는 html 요소인 태그에 매핑됩니다. 

 

 HTML에서의 <form> 태그는 웹사이트에서 사용자가 데이터를 입력할 수 있도록 하고 그 데이터를 서버로 보내주는 역할을 하는데요. 이때 폼은 action과 method 옵션을 통해 2가지 정보를 담고 있어야 합니다. 

 

  • action : 폼이 제출(submit) 될 때 처리가 필요한 데이터를 전달받는 곳의 URL 주소, 설정이 안 되어 있으면 현재 페이지 URL로 다시 제출
  • method : 데이터를 보내는데 사용되는 HTTP 메소드 - POST & GET

 

 

 Django에서 사용자 입력을 받는 방법에는 3가지가 있습니다. 

 

1. HTML Form 이용하기 

 

2. Django Form 이용하기

 

3. Django modelForm 이용하기 

 

 

 models.py 에 학번, 이름, 전공 데이터를 갖는 모델(객체)를 하나 만들겠습니다~

 

 

 

 

[ HTML Form 이용하기 ]

 

 1. html form 작성하기 

 

 이때 django에서 <form> 형식을 사용하기 위해선 보안상의 문제로 <form> 태그 내부에 반드시 {% csrf_token %} 을 작성해주셔야 합니다. 

 

<!-- ../templates/index.html -->

...

<body>
  <h1>Django 사용자 입력받기</h1>
  <h2>HTML Form 이용하기</h2>
  <hr>
  <form action="{% url 'createform' %}" method="POST">
    {% csrf_token %}
    <div>
      <label for="studentID">학번</label>
      <input type="text" name="studentID" id="studentID">
    </div>
    <div>
      <label for="name">이름</label>
      <input type="text" name="name" id="name">
    </div>
    <div>
      <label for="major">전공</label>
      <input type="text" name="major" id="major">
    </div>
    <br>
    <input type="submit" value="제출">
  </form>
</body>

 

 

 2. URL 등록하기 

 

 위에서 작성한 폼을 통해 사용자로부터 데이터를 입력받은 뒤 {% url 'createform' %} 이라는 URL로 전달되도록 하였으니 urls.py에서 해당 URL을 등록해줘야합니다. 

 

# ../urls.py

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('createform/', views.createform, name='createform')  # 데이터를 처리할 url 등록!
]

 

 

 

 3. 데이터 처리하기  

 

 views.py 안에 createform() 이름의 함수를 작성하여 사용자가 입력한 데이터를 데이터베이스에 등록해줍니다. 

 

 인자로 받은 요청의 메소드가 POST라면 Student 모델을 생성 및 값을 할당하여 데이터베이스에 반영합니다. 

 

 이때 model.save()를 통해 해당 모델 객체를 데이터베이스에 저장할 수 있습니다. 

 

# ../views.py

from django.shortcuts import redirect, render
from .models import Student

def home(request):
    return render(request, 'index.html')

def createform(request):

    if request.method == 'POST':
        std = Student()
        std.studentID = request.POST['studentID']
        std.name = request.POST['name']
        std.major = request.POST['major']
        std.save()

    return redirect('home')

 

 학번 / 이름 / 전공이 1234 / 홍길동 / 컴퓨터공학과인 값을 입력하여 데이터베이스에 잘 반영되었는지 admin 사이트에서 확인해봅시다. 

 

 

 

 

 

[ Django Form 이용하기 ]

 

1. html 작성하기 

 

 Djnago 폼을 이용한 예제에서는 <a> 태그를 눌렀을 때 폼을 입력할 수 있는 페이지로 이동하도록 작성하겠습니다. 

 

<!-- ../templates/index.html -->

...

<body>
  <h1>Django 사용자 입력받기</h1>
  <h2>Django Form 이용하기</h2>
  <hr>
  <a href="{% url 'createform' %}">Django form을 이용한 사용자 입력받기</a>
</body>

 

 

 

2. url 등록하기 

 

 마찬가지로 urls.py 에 url을 등록합니다. 

 

# ../urls.py

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('createform/', views.createform, name='createform')
]

 

 

3. form 객체 생성하기 

 

 forms.py 파일을 하나 생성합니다. 

 

 django의 forms 기능을 사용하여 Form 을 생성하는 파일로, 이 폼 객체는 models.py에 등록한 모델 객체와 매우 유사합니다. 

 

# ../forms.py

from django import forms
from .models import Student


class StdForm(forms.Form):
    studentID = forms.IntegerField()
    name = forms.CharField(max_length=30)
    major = forms.CharField(max_length=100)

 

 

 

4. 데이터 처리하기 

 

 이제 views.py에서 요청을 받았을 때 데이터를 처리할 로직을 세웁니다. 

 

 이때 요청의 메소드가 POST 라면 사용자가 폼에 데이터를 입력한 뒤 submit을 한 상태이니 데이터베이스에 반영해줘야겠죠!

 

 이때 위에서 작성한 StdForm 폼 객체를 이용하여 해당 폼 객체의 입력값에 대한 유효성을 검사한 뒤 데이터베이스에 반영합니다. 

 

 만약 요청의 메소드가 GET 이라면 위에서 작성한 StdForm을 html 형태로 사용자에게 보여주면 되겠죠?

 

 render()의 세 번째 인자로는 views.py 내의 데이터를 html에 넘겨줄 수 있습니다. 단, dict 형으로 넘겨주어야 합니다. 이 데이터는 html 내에서 {{ }} 에 감싸진 채로 표현될 수 있습니다. 

 

from django.shortcuts import redirect, render
from .models import Student
from .forms import StdForm


def home(request):
    return render(request, 'index.html')


def createform(request):
    # POST라면 입력한 내용을 form을 이용하여 데이터베이스에 저장
    if request.method == 'POST':
        form = StdForm(request.POST)

        # 유효성 검사
        if form.is_valid():
            std = Student()
            std.studentID = form.cleaned_data['studentID']
            std.name = form.cleaned_data['name']
            std.major = form.cleaned_data['major']
            std.save()
            return redirect('home')

    # GET이라면 입력값을 받을 수 있는 html을 가져다 줘야함
    else:
        form = StdForm()

    return render(request, 'form_create.html', {'form': form})

 

 

 

5. 폼을 보여줄 html 작성하기 

 

views.py 에서 요청이 GET 이라면 해당 폼을 사용자에게 보여주어야 합니다. 

 

이때 render()의 세 번째 인자로 받은 views.py 내의 데이터는 {{ }} 로 표현될 수 있다고 했죠? 이 데이터가 Django의 폼이라면 .as_table 을 사용하여 쉽게 테이블 형태로 폼을 작성할 수 있습니다. 

 

<!-- ../templates/form_create.html -->

<form action="" method="POST">
  {% csrf_token %}
  <table>
    {{ form.as_table }}
  </table>
  <input type="submit" value="제출">
</form>

 

 

 

 

[ Django modelForm 이용하기 ]

 

 modelForm을 이용한 사용자 입력받기는 Django의 Form을 이용한 방법과 유사합니다. 

 

 위 방식과 동일하되 ModelForm에 맞게 forms.py, views.py 내용을 다음과 같이 수정합니다. 

# ../forms.py

from django import forms
from .models import Student
from dataclasses import field


class StdForm(forms.ModelForm):
    class Meta:
        model = Student
        # fields = '__all__'
        fields = ['studentID', 'name', 'major']

 

# ../views.py

from django.shortcuts import redirect, render
from .models import Student
from .forms import StdForm

def home(request):
    return render(request, 'index.html')


def createform(request):
    # POST라면 입력한 내용을 form을 이용하여 데이터베이스에 저장
    if request.method == 'POST' or request.method == 'FILES':
        form = StdForm(request.POST, request.FILES)

        # 유효성 검사
        if form.is_valid():
            form.save()
            return redirect('home')

    # GET이라면 입력값을 받을 수 있는 html을 가져다 줘야함
    else:
        form = StdForm()

    return render(request, 'form_create.html', {'form': form})
반응형