URL 주소를 변수로 사용하는 것
URL의 일부를 변수로 지정하여 view 함수의 인자로 넘길 수 있음
즉, 변수 값에 따라 하나의 path()에 여러 페이지를 연결 시킬 수 있음
path('account/user/<int:user_pk>/',views.user)
동적 라우팅
# urls.py
urlpatterns = [
...,
# path('hello/<name>/', views.hello),
path('hello/<str:name>/', views.hello),
]
# views.py
def hello(request, name):
context = {
'name': name,
}
return render(request, 'hello.html', context)
<!-- hello.html -->
{% extends 'base.html' %}
{% block content %}
<h1>만나서 반가워 {{ name }}!</h1>
{% endblock %}
두번째 app 생성 및 등록
$ python manage.py startapp pages
INSTALLED_APPS = [
'articles',
'pages',
...,
]
# articles/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index),
path('greeting/', views.greeting),
path('dinner/', views.dinner),
path('throw/', views.throw),
path('catch/', views.catch),
path('hello/<str:name>/', views.hello),
]
# pages/urls.py
from django.urls import path
urlpatterns = [
]
[주의] urlpatterns list가 없는 경우 에러가 발생한다.
# firstpjt/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('pages/', include('pages.urls')),
]
from .module import ..
)를 권장# articles/urls.py
urlpatterns = [
path('index/', views.index, name='index'),
path('greeting/', views.greeting, name='greeting'),
path('dinner/', views.dinner, name='dinner'),
path('throw/', views.throw, name='throw'),
path('catch/', views.catch, name='catch'),
path('hello/<str:name>/', views.hello, name='hello'),
]
<!-- index.html -->
{% extends 'base.html' %}
{% block content %}
<h1>만나서 반가워요!</h1>
<a href="{% url 'greeting' %}">greeting</a>
<a href="{% url 'dinner' %}">dinner</a>
<a href="{% url 'throw' %}">throw</a>
{% endblock %}
{% url '' %}
두번째 app의 index 페이지 작성
# pages/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index, name='index'),
]
# pages/views.py
def index(request):
return render(request, 'index.html')
<!-- pages/templates/index.html -->
{% extends 'base.html' %}
{% block content %}
<h1>두번째 앱의 index</h1>
{% endblock %}
<!-- articles/templates/index.html -->
{% extends 'base.html' %}
{% block content %}
<h1>만나서 반가워요!</h1>
<a href="{% url 'greeting' %}">greeting</a>
<a href="{% url 'dinner' %}">dinner</a>
<a href="{% url 'dtl_practice' %}">dtl-practice</a>
<a href="{% url 'throw' %}">throw</a>
<a href="{% url 'index' %}">두번째 앱 index로 이동</a>
{% endblock %}
URL namespace
Template namespace
app_name attribute 작성
# pages/urls.py
app_name = 'pages'
urlpatterns = [
path('index/', views.index, name='index'),
]
# articles/urls.py
app_name = 'articles'
urlpatterns = [
...,
]
app_name
attribute 값 작성:
연산자를 사용하여 지정articles
이고 URL name이 index
인 주소 참조는 articles:index
<!-- articles/templates/index.html -->
{% extends 'base.html' %}
{% block content %}
<h1>만나서 반가워요!</h1>
<a href="{% url 'articles:greeting' %}">greeting</a>
<a href="{% url 'articles:dinner' %}">dinner</a>
<a href="{% url 'articles:throw' %}">throw</a>
<h2><a href="{% url 'pages:index' %}">두번째 앱 index로 이동</a></h2>
{% endblock %}
Django는 기본적으로 app_name/templates/
경로에 있는 templates 파일들만 찾을 수 있으며, INSTALLED_APPS에 작성한 app 순서로 tamplate을 검색 후 렌더링
임의로 templates의 폴더 구조를 app_name/templates/app_name
형태로 변경해 임의로 이름 공간 생성 후 변경된 추가 경로 작성
# articles/views.py
return render(request, 'articles/index.html')
# pages/views.py
return render(request, 'pages/index.html')