Django Template

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

project/settings.py์— TEMPLATES ๊ด€๋ จ ์„ค์ •์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์–ด๋–ป๊ฒŒ tmeplate์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋ Œ๋”๋ง ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

'APP_DIRS': True ๋Š” INSTALLED_APPS ๋””๋ ‰ํ† ๋ฆฌ์˜ templates ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

Template ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•  app ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„์— templates ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. templates ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„์— polls ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์— index.html ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

polls
โ”œโ”€โ”€ __init__.py
โ”œโ”€โ”€ admin.py
โ”œโ”€โ”€ apps.py
โ”œโ”€โ”€ migrations
โ”‚   โ”œโ”€โ”€ 0001_initial.py
โ”‚   โ”œโ”€โ”€ __init__.py
โ”œโ”€โ”€ models.py
โ”œโ”€โ”€ templates
โ”‚   โ””โ”€โ”€ polls
โ”‚       โ””โ”€โ”€ index.html
โ”œโ”€โ”€ tests.py
โ”œโ”€โ”€ urls.py
โ””โ”€โ”€ views.py

polls/templates/polls/index.html ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์™œ templates ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„์— polls ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ค€๊ฑธ๊นŒ?

Django์—์„œ๋Š” ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ template์„ ์„ ํƒํ•œ๋‹ค. ๋งŒ์•ฝ ๋™์ผํ•œ template์ด ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ์„ ๊ฒฝ์šฐ์— ์ด ๋‘˜์˜ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ฐ€์žฅ ์ •ํ™•ํ•œ template์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ ์ด๋ฆ„๊ณต๊ฐ„์œผ๋กœ ๊ตฌ๋ถ„์ง“๋Š” ๊ฒƒ์ด๋‹ค.

<!-- polls/index.html -->
{% if last_question_list %}
    <ul>
        {% for question in last_question_list %}
            <li><a href="/polls/{{question.id}}/">{{ question.question_text}}</a></li>
        {% endfor %}
    </ul>
{% else %}
   <p>No polls are avaliable.</p>
{% endif %}

Template ์–ธ์–ด

HTML(์ •์ )์— ํŒŒ์ด์ฌ ์ฝ”๋“œ(๋™์ )๋ฅผ ๋ฐ”๋กœ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค. template tag{}๋Š” ํŒŒ์ด์ฌ์„ HTML์œผ๋กœ ๋ฐ”๊พธ์–ด ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋™์ ์ธ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ruby์—์„œ๋Š” html.erb

{{๋ณ€์ˆ˜}}

context๋กœ ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜๋ฅผ ํ…œํ”Œ๋ฆฟ์—์„œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค‘๊ด„ํ˜ธ ์•ˆ์— ๋ณ€์ˆ˜์ด๋ฆ„์„ ๋„ฃ์–ด์„œ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

<h1>{{ title }}</h1>
<p>{{ context }}</p>

{%%} ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ

`

` ํƒœ๊ทธ ์•ˆ์—๋Š” python์˜ for๋ฌธ, if๋ฌธ๊ณผ ๊ฐ™์ด ํƒฌํ”Œ๋ฆฟ์˜ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค.

{% if count > 0 %}
    Data Count = {{ count }}
{% else %}
    No Data
{% endif %}

{% for item in dataList %}
  <li>{{ item.name }}</li>
{% endfor %}

{% csrf_token %}

{{ | }} ํ•„ํ„ฐ

ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํŠน์ •ํ•œ ํฌ๋งท์œผ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ด๋•Œ | ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•ด ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ ์งœ๋ฅผ ํŠน์ • ๋‚ ์งœ ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ๋ฌธ์ž์—ด์„ ๋Œ€,์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

<!--๋‚ ์งœ ํฌ๋งท ์ง€์ •-->
{{ createDate|date:"Y-m-d" }}

<!--์†Œ๋ฌธ์ž ๋ณ€๊ฒฝ-->
{{ lastName|lower }}

<!-- ๋ผ์ธ ๋ณ€๊ฒฝ -->
{{ post.text|linebreaksbr }}

๋‚ด์žฅ ํ•„ํ„ฐ ๋ ˆํผ๋Ÿฐ์Šค ์—์„œ ์ „์ฒด ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

`` ์ฃผ์„

ํ…œํ•„๋ฆฟ์—์„œ ์ฃผ์„๊ตฌ๋ฌธ์€ {# #}์ด๋‹ค.

{# ์ฃผ์„, ์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ค๋ช… #}

HTML Escape

HTML ๋‚ด์šฉ์ค‘์— <,>,',",& ๊ณผ ๊ฐ™์€ ๋ฌธ์ž๋“ค์ด ์žˆ์œผ๋ฉด ๊ทธ ๋ฌธ์ž์— ์ƒ์‘ํ•˜๋Š” HTML Entity๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

ํ…œํ”Œ๋ฆฟ์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ `

ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋‚˜escape` ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# autoescape ํƒœ๊ทธ
{% autoescape on %}     
    {{ content }}
{% endautoescape %}

# escape ํ•„ํ„ฐ
{{ content|escape }}

์ฐธ์กฐ

Last updated