URL Namespace / Template 상속

justyoon·2023년 4월 12일
0

AI5 Python/Django

목록 보기
29/31
post-thumbnail

앱을 만들면 views.py가 각각 따로 존재하고 함수이름도 같은 경우가 생겨 요청간의 충돌이 발생할 수 있습니다.
이런 문제를 예방하고 url관리를 용이하게 하기 위해서 새로운 앱에 url을 구분해 보겠습니다.

구분하기

## django_tutorial/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
    path('foods/', include('foods.urls')),
]

프로젝트의 메인 앱인 django_tutorial의 urls.py에서는 개별 앱까지만 경로를 설정합니다. 뒷부분은 각 앱과 연결된 주소를 설정해줍니다.

## articles/urls.py
from django.urls import path
from articles import views

urlpatterns=[
   path('index/', views.index),
   path('dinner/<str:name>/', views.dinner),
   path('review/', views.review),
   path('create_review/', views.create_review),
]

개별 앱인 articles에 해당하는 다양한 패턴의 경로들이 저장되어 있습니다.

articles 앱의 dinner 경로로 출력됨

url namespace

namespace를 사용해주면 불러올 주소를 'review' 등의 이름으로 임의 지정하고 불러올 수 있습니다. 이름을 명시했을때 좋은점은 연결된 주소가 바뀌더라도 장고 템플릿 언어가 식별하고 찾아서 보내줄 수 있습니다. 또한 코드가 깔끔해집니다.

>>app_name = 'articles'
urlpatterns=[
    path('index/', views.index),
    path('dinner/<str:name>/', views.dinner),
    path('review/', views.review, >>name='review'),
    path('create_review/', views.create_review, >>name='create_review'),
]

namespace를 쓸때는 url 'appname:pathname' 형태로 작성합니다.

<form action="{% url 'articles:create_review' %}" method="POST">

template 상속

대부분의 웹사이트들이 상단에 들어가는 헤더, 하단에 들어가는 푸터와같은 것을 공통으로 사용하고 있습니다. 공통적으로 빈번하게 이뤄지는 작업이기 때문에 이를 매번 반복할 필요가 없게 만든게 바로 장고 프레임워크의 존재 이유이며 개발자들의 철학이기도 합니다.
이번에는 매번 공통되는 html과 바뀌는 것들을 잘 섞어서 쓰기위해 템플릿의 상속 개념을 이용해 봅니다.

base template

template의 base가 되는 base.html을 만들어봅니다.

<!-- articles/templates/base.html -->
<h1>header</h1>
<!-- 여러가지 템플릿을 사용할 수 있기 때문에
content라는 이름의 구별된 block 생성-->
{%block content %} {% endblock %}
<h1>footer</h1>
<!-- articles/templates/dinner.html -->
>>{% extends 'base.html' %} {% block content %}
<h1>오늘 {{name}}님의 저녁은 {{pick.name}} 입니다.</h1>
...
...
>>{% endblock %}

상속받고자 하는 템플릿의 시작부분에 기반 템플릿을 이런 형식으로 작성합니다. header와 footer를 불러올 수 있습니다. 여기선 base.html이 기반템플릿입니다.

{% extends '기반템플릿이름.html' %}
{% block 이름 %} {% endblock %}

이런식으로 다른 템플릿에서도 기반 내용을 상속 받을 수 있습니다.

profile
with gratitude, optimism is sustainable

0개의 댓글