참고:
[Web Applicateion]서버 사이드와 클라이언트 사이드,백앤드와 프론트앤드
pip install django로 반드시 장고를 설치하여야한다.
또한 장고의 버전은 2이므로 1을 사용하는 사람들의 경우 서로 많이 차이날 수 있다는 점을 잘 알고 접근하여야 한다.
이제 form을 만들어보자.
뭐 form만드는 거를 여기서 왜 다루는지 의아해 하는 사람이 있을 수도 있다.
왜냐하면 form의 경우에는 html의 소관이 아닌가 생각하는 사람이 있을 수 있기 때문이다.
물론 과거에는 그러하였지만 최근에는 form역시 html에서 만드는 경우가 부쩍해서 늘고 있다.
이게 MVC패턴(django의 경우 MTV패턴)과 코드 분활에 초점을 맞추기 때문이다.
따라서 우리도 form html코드로 타이핑하지 않고 django를 통해서 만들어낼 것이다.
forms.py라는 파이썬 코드를 생성하여 준다.
이제부터 우리가 만든 form들은 모두 forms.py에 적재될 것이다.
물론 꼭 forms.py라고 이름을 지어줄 필요는 없다.
그러나 관습적으로 forms.py라고 지어주는 경향이 있다.
# applications forms.py
from django import forms
class PersonForm(forms.Form):
name = forms.CharField(label='name', max_length=30)
birth = forms.DateField(label='birth')
age = forms.IntegerField(label='age')
자신이 만들고 싶은 form에는 자신이 넣고 싶은 데이터가 있을 것이다.
해당 타입을 지켜서 넣어주어야하는건 당연하다면 당연하다.
우리는 앞에서도 계속 해왔던 Person을 가지고 테스트를 할 것인데 먼저 자신이 사용할 폼의 필드를 모두 넣어준다.
각각의 타입을 맞춰서 넣어준다.
왜냐하면 이 타입을 정해주어야 나중에 제대로 값이 들어왔는지 데이터를 확인할 수 있기 때문이다.
만들고 나면 views.py를 수정해주자.
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Person
from .forms import PersonForm
# Create your views here.
def person_test(request):
person_list = Person.objects.order_by('-name')
context = {'person_list': person_list}
return render(request, 'dj/index.html', context)
def person_test_detail(request, pid):
person = Person.objects.get(pk=pid)
context = {'person': person}
return render(request, 'dj/detail.html', context)
def form_test(request):
if request.method == 'POST':
pass
elif request.method == 'GET':
form = PersonForm()
return render(request, 'dj/form.html', {'form': form})
else:
pass
과거의 코드가 남아있지만 새로 추가된건 마지막의 form_test하나뿐이다.
여기서 우리는 request를 확인하여서 POST경우와 GET일 경우를 나눈다.
사실 위와 같이 꼭 짤필요는 없다. 경우에 따라서 POST와 GET만 사용할 수도 있기 때문이다.
django에서 대부분의 경우 POST와 GET으로 나눠서 POST일 경우에는 form처리를, GET의 경우 화면에 보여주는 역활을 하게 만든다.
위의 코드를 보면 form도 일종의 변수로서 값을 넘기는 형태라는 것을 알 수 있다.
# applications urls.py
from django.urls import path
from . import views
app_name = 'dj'
urlpatterns = [
path('person-test/', views.person_test, name='person-test'),
path('person-test/<int:pid>/', views.person_test_detail, name='person-test-id'),
path('form-test/', views.form_test, name='form-test')
]
어플리케이션단의 urls를 보면 마지막에 form-test가 보인다. 우리가 테스트할 url이다.
이를 GET으로 들어가면 form이보여주게하고 post로 들어가면 그 값을 처리하는 작업을 할것이다.
DB와 연동되서 post로 처리하는것은 이번에는 다루지 않고 다음에 다룰 것이다.
{# from.thml #}
<form action="{% url 'dj:form-test' %}" method="post">
{% csrf_token %}
{{ form|linebreaks }}
<input type="submit" value="submit" name="submit">
</form>
이제 화면에 보여줄 form.html을 만들자.
여기서 form의 액션은 url과 똑같이 만들어주고 method를 다르게해서 접근하도록 하자.
그리고 아래에 변수를 form을 불러주면된다.
여기서 {{form}}으로도 불러올 수 있지만 필자의 예제에서는 |linebreaks가 추가되어있다.
왜 이런식으로 했냐하면 그냥 쓰면 강제개행이 적용되지 않기 때문이다.
만약 강제개행을 원치 않는다면 | linebreaks를 지워주면된다.
이제 준비가 다 됬으니 실행시켜보도록하자.
폼이 제대로 생성되는걸 확인할 수 있다.
폼을 사용해서 데이터를 처리하는 것은 다음장에 하도록 하자.
'Programming > Python-Django' 카테고리의 다른 글
[Django-09]class based view (0) | 2018.02.11 |
---|---|
[Django-08]form과 model연결 (0) | 2018.02.03 |
[Django-06]model을 templates로 출력하기 (0) | 2018.02.03 |
[Django-05]db와 model 사용하기 (0) | 2018.02.03 |
[Django-04]http response (0) | 2018.01.30 |