๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/Django

Django_์žฅ๊ณ  ๋ถ€์ˆ˜๊ธฐ (4)_ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•

by KASSID 2022. 6. 30.

๋ชฉ์ฐจ

    728x90

    Django ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•

    template์—์„œ DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

     

    HTMLํŒŒ์ผ์€ ์ •์  ํŒŒ์ผ์ด๋‹ค. ๊ทธ์— ๋ฐ˜ํ•ด ํŒŒ์ด์ฌ์€ ๋™์ ์ด๋‹ค.

    ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์€ ํŒŒ์ด์ฌ์„ HTML๋กœ ๋ณ€ํ™˜์‹œ์ผœ, ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋™์ ์ธ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

     

    ๋™์  ๋ฐ์ดํ„ฐ

    ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ์ฟผ๋ฆฌ์…‹์„ ์ด์šฉํ•˜์—ฌ views.py์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค.

     

    ex)

    from django.shortcuts import render
    from django.utils import timezone
    from .models import Post
    
    def post_list(request):
        posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
        return render(request, 'blog/post_list.html', {'posts': posts})

    views.py์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด

    ์ฟผ๋ฆฌ์…‹์„ ์ด์šฉํ•˜์—ฌ posts๋ผ๋Š” ๋ณ€์ˆ˜์— DB์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์˜€๋‹ค.

    ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” renderํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด template์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

    {'posts': posts}๊ฐ€ ๋ฐ”๋กœ ๊ทธ ๋ถ€๋ถ„์ด๋‹ค.

     

    ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•

    ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” ํŠน์ •ํ•œ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณด์ž

     

    1. {{ }}

    - ์ค‘๊ด„ํ˜ธ 2๊ฐœ๋ฅผ ๊ฒน์น  ๋•Œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋Š” view์—์„œ ์ „๋‹ฌ๋œ ๊ฒƒ์ด๋‹ค.

    - ์˜ˆ์‹œ๋กœ posts.title ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ฉค๋ฒ„๋“ค์— ๋Œ€ํ•œ ์ ‘๊ทผ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    {{ posts }}

    2. ํƒฌํ”Œ๋ฆฟ ํƒœ๊ทธ {% %}

    - html ์ƒ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋กœ์ง์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒœ๊ทธ์ด๋‹ค.

    - load static, for, if ๋“ฑ

    - and, or, not, and not, > >=, < <= ,in, not in ๋“ฑ์˜ ๋น„๊ต์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    - ์˜ˆ์‹œ_1) ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์„ for loop๋กœ ํ•œ ๊ฐœ์”ฉ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

    {% for post in posts %}
        {{ post }}
    {% endfor %}

    - ์˜ˆ์‹œ_2) if๋ฌธ์œผ๋กœ ์กฐ๊ฑด์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    {% if not user.is_authenticated %}
    	<div class="username">
    		<a href="{% url 'login' %}" class="login-link">
    			Login
    			<i class="fas fa-sign-in-alt"></i>
    		</a>        
    	</div>
    {% else %}
    	<div class="username">Hello {{ user.username }} (<a href="{% url 'logout' %}">Logout <i class="fas fa-sign-out-alt"></i></a>)</div>
    {% endif %}

    - ์˜ˆ์‹œ_3 {% csrf_token %}

    CSRF ๊ณต๊ฒฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํƒœ๊ทธ์ด๋‹ค, ์žฅ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ CSRF ํ† ํฐ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆ.

    formํƒœ๊ทธ์˜ ์ฒซ ์ค„์— ์ž…๋ ฅํ•œ๋‹ค.

     

    - ์˜ˆ์‹œ_4 {% load ... %}

    ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ ๋ฐ ํ•„ํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

    ์ •์ ํŒŒ์ผ๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

     

    -์˜ˆ์‹œ_5 block content, extends

    ํ…œํ”Œ๋ฆฟ ํ™•์žฅ์— ํ™œ์šฉํ•˜๋Š” ํƒœ๊ทธ์ด๋‹ค.

     

    ๊ธฐ์ € template

     <div class="post-list">
    	{% block content %}
    	{% endblock %}
    </div>

    ํŒŒ์ƒ template

    {% extends 'blog/base.html' %}
    
    {% block content %}
        <h1>New post</h1>
        <form method="POST" class="post-form">{% csrf_token %}
            {{ form.as_p }}
            <button type="submit" class="save btn btn-default"><i class="fas fa-save"></i></button>
        </form>
    {% endblock %}

    3. ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ { ... | ~ }

    - ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํŠน์ •ํ•œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    - ๋ณ€์ˆ˜๋ช… '|' ๋’ค์— ํ•„ํ„ฐ๋ฅผ ๋ถ™์ธ๋‹ค.

    ex)

    - length, upper, lower, linebreaksbr(ํ–‰ ๋ฐ”๋€” ์‹œ ๋ฌธ๋‹จ ๋ฐ”๊ฟˆ)

     

    ์ถ”๊ฐ€ ์ž๋ฃŒ

    (https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#ref-templates-builtins-tags)

    ๋Œ“๊ธ€