[django 2.2] Get/Post를 동일한 템플릿에 표시하기.

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 }}&nbsp;&nbsp; | {{i.title}} &nbsp;&nbsp;| {{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 }}&nbsp;&nbsp; |
        <input type="hidden" name="title" value="{{i.title}}">{{i.title}} &nbsp;&nbsp;|
        {{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>

답글 남기기

Your email address will not be published.