Django class based view를 이용하여 동일한 페이지에 GET 과 POST를 모두 표시하는 방법.
1. View 작성(app/views.py)
class GetPostView(View): template_name = 'getpost.html' data = [ {'name': 'fox', 'title': 'test1', 'is_published': True }, {'name': 'wolf', 'title': 'test 2', 'is_published': False}, {'name': 'cat', 'title': 'life of cat', 'is_published': True}, ] def get(self, request, *argc, **kwargs): context = { 'data': self.data, } return render(request, self.template_name, context) def post(self, request, *argc, **kwargs): result = request.POST context = { 'data': self.data, 'result': result, } return render(request, self.template_name, context)
2. url 작성(app/urls.py)
from .views import GetPostView urlpatterns = [ path('getpost/', GetPostView.as_view(), name='getpost'), ]
3. template 작성(templates/getpost.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>GET and POST</title> </head> <body> <form method="POST" action=""> {% csrf_token %} {% for i in data %} <p><input type="radio" name="name" value="{{i.name}}">{{i.name }} | {{i.title}} | {{i.is_published}} </p> {% endfor %} <p><input type="submit" value="Select"></p> </form> {% if result %} {{ result.name }} is selected... {% endif %} </body> </html>
이제, test 서버를 실행하고 접속해 보면(GET) 아래와 같은 화면을 볼 수 있다.
라디오버튼을 선택하고 ‘Select’ 버튼을 누르면(POST), 선택한 항목의 값을 볼 수 있다.
4. name 과 title을 같이 표시하고 싶으면 템플릿을 아래와 같이 수정한다.
view의 post 메소드에서 request.POST 의 결과가 딕셔너리타입을 가지므로, 아래와 같은 템플릿이 가능하다.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>GET and POST</title> </head> <body> <form method="POST" action=""> {% csrf_token %} {% for i in data %} <p><input type="radio" name="name" value="{{i.name}}">{{i.name }} | <input type="hidden" name="title" value="{{i.title}}">{{i.title}} | {{i.is_published}} </p> {% endfor %} <p><input type="submit" value="Select"></p> </form> {% if result %} NAME: {{ result.name }}<br> TITLE: {{result.title}} <br>is selected... {% endif %} </body> </html>