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>