Django2, template에 dict 타입 데이타 표시하기

테스트를 위해 view를 만든다.app/views.py 에 테스트 뷰를 만든다.

class TestView(TemplateView):
    template_name = test.html'
    context = [ {'IP ADDRESS': '192.168.100.1', 'HOSTNAME': 'Fox', 'Connect': 'ssh'},
                {'IP ADDRESS': '192.168.100.2', 'HOSTNAME': 'Wolf', 'Connect': 'telnet'},
                {'IP ADDRESS': '192.168.100.3', 'HOSTNAME': 'Hotdog', 'Connect': 'ssh'},
               ]
    def get(self, request):
        return render(request, self.template_name, {'context': self.context})

app/urls.py 에 path를 등록한다.

urlpatterns = [
    path('test/', TestView.as_view(), name='test'),
]

템플릿을 만든다. templates/app/test.html

{% block content %}

<table>
    <tr>
        <td>IP</td><td>Hostname</td><td>Connect</td>
    </tr>
{% for i in context %}
    <tr>
    {% for key, value in i.items %}

        <td>
            {{ value }}
        </td>
    {% endfor %}
    </tr>
{% endfor %}

</table>
{% endblock content %}

여기까지 하면 모든 content를 템플릿을 통해 표시 할 수는 있지만, 원하는 값을 원하는 위치에 표시하는것은 쉽지 않다.

이제, 이 문제를 해결하기위해 custom template tag를 만든다.app/templatetags 디렉토리를 생성한다.
__init__.py 생성하고, custom_filters.py 를 만든 후 아래 내용을 넣는다. 그리고, 반드시, 서버를 다시 시작해야 한다(manage.py runserver). 다시 시작하지 않으면 적용되지 않는다.

from django import template
register = template.Library()

@register.filter('reportkey')
def reportkey(dict_data, key):
    if key in dict_data:
        return dict_data.get(key)

이제, 템플릿을 수정한다. custom template tags를 load하고, {{ dict | custom_filter_func:”key” }} 형식으로 데이타를 지정하면 된다.

emplates/app/test.html

{% load custom_filters %}

{% block content %}
<p>Test ...</p>
{% for c in context %}
<table>
    <tr>
        <td>IP Address</td>
        <td>Hostname</td>
    </tr>
    <tr>
         <td>{{ c | reportkey:"IP ADDRESS" }}</td>
         <td>{{ c | reportkey:"HOSTNAME" }}</td>
    </tr>
    <tr>
        <td>Connect</td>
        <td>
            {{ c | reportkey:"Connect" }}
        </td>
    </tr>
</table>

<p>
    <hr>
</p>
{% endfor %}
{% endblock %}

답글 남기기

Your email address will not be published.