[Django] URL 설정

2022. 3. 11. 17:28·캡스톤/Django

1. do_it_django_prj/urls.py

do_it_django_prj/urls.py 은 웹 사이트의 표지판같은 역할을 한다. 

urls.py 의 코드를 보면

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls), # (1)
    path('blog/', include('blog.urls')), # (2)
    path('', include('single_pages.urls')), # (3)
]

(1) 주소창에 '사이트주소/admin/' 입력 시, admin.site.urls 을 호출

(2) 주소창에 '사이트주소/blog/' 입력 시, blog.urls 을 호출

(3) 주소창에 아무것도 입력하지 않을 경우,  single_pages.urls 을 호출

 

2. blog

주소창에 '사이트주소/blog/' 입력 시, blog/urls.py 를 호출하기 위해 아래의 코드를 작성한다.

from django.urls import path
from . import views # 현재 디렉토리에 있는 views.py 를 가져오라는 의미

urlpatterns = [
    path('<int:pk>/', views.single_post_page), # 만약 /blog/ 뒤에 정수 형태의 값이 붙는 url 이라면 blog/views.py 의 single_post_page() 함수에 정의된 대로 처리함
    path('', views.index),
]

또한 '[Django] Django 구조' 에서 언급한 것 처럼 blog/views.py 는 blog/urls.py 에서 실행시키고자 하는 내용이 있어야 함으로 아래의 코드를 작성해준다.

from django.shortcuts import render

def index(request):
    return render(
        request,
        'blog/index.html',
    )

위의 코드의 역할은 render() 함수를 이용해 templates 폴더에서 blog 폴더의 index.html 을 찾아 웹 페이지에 시각화 해준다.

 

이것을 위해 blog/templates/blog 폴더와 그 안의 blog/templates/blog/index.html 파일 또한 만들어야 한다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
</head>

<body>
<h1>Blog</h1>
</body>
</html>

 

이후 주소창에 '127.0.0.1:8000/blog/' 에 접속 시

 

Blog 글자가 출력되면 성공!

 

이 blog 페이지에 여러 Post(게시글)을  출력하기 위해서는 blog/views.py 를 수정하면 된다. views.py 에서는 DB 에 저장되어 있는 Post 의 데이터를 가져와야 하므로 '[Django] 모델 생성' 에서 봤던 것 처럼 blog/models.py 에 정의된 Post 모델을 임포트하고, index() 함수에서 Post.object.all()로 모든 레코드를 가져와 posts 에 저장한다. 마지막으로 render() 함수 안에 posts를 딕셔너리 형태로 추가한다(?)

from django.shortcuts import render
from .models import Post

def index(request):
    posts = Post.objects.all().order_by('-pk') # views.py 에서 DB 로 쿼리를 날려 원하는 레코드를 가져올 수 있음. order_by('-pk') 는 최신 Post 부터 볼 수 있게 해줌

    return render(
        request,
        'blog/index.html',
        {
            'posts': posts,
        }
    )

 

이제 DB 에서 가져온 Post 를 웹 페이지에 시각화하기 위해 blog/templates/blog/index.html 을 수정해준다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
</head>

<body>
<h1>Blog</h1>
{% for p in posts %}
<hr/>
<h2>{{ p.title }}</h2> <!-- 포스트 제목 !-->
<h4>{{ p.created_at }}</h4> <!-- 포스트 생성 시간 !-->
<p>{{ p.content }}</p> <!-- 포스트 내용 !-->
{% endfor %}
</body>
</html>

 

작성 후 웹 페이지에 접속하면

이렇게 DB 에 저장되어 있던 Post 들의 정보가 웹 페이지에 보인다.

 

만약에 포스트의 content 필드에 작성된 내용이 길 경우 /blog/ 페이지에서 한 눈에 내용을 파악하기가 어려울 것이다. 그리고 포스트의 댓글 기능도 추가해야 하기 때문에 포스트의 상세 페이지가 필요하다.

 

그러기 위해선 blog/urls.py, blog/views.py, blog/models.py, index.html 을 수정하고 상세 페이지의 html 파일을 만들어야 한다.

 

먼저 blog/urls.py 을 수정한다.

from django.urls import path
from . import views # 현재 디렉토리에 있는 views.py 를 가져오라는 의미

urlpatterns = [
    path('<int:pk>/', views.single_post_page), # 만약 /blog/ 뒤에 정수 형태의 값이 붙는 url 이라면 blog/views.py 의 single_post_page() 함수에 정의된 대로 처리함
    path('', views.index),
]

 

그리고 blog/views.py 를 수정한다.

from django.shortcuts import render
from django.views.generic import ListView
from .models import Post

class postList(ListView):
    model = Post


# Create your views here.
def index(request):
    posts = Post.objects.all() # views.py 에서 DB 로 쿼리를 날려 원하는 레코드를 가져올 수 있음

    return render(
        request,
        'blog/index.html',
        {
            'posts': posts,
        }
    )

def single_post_page(request, pk):
    post = Post.objects.get(pk=pk) # Post.object.get() 은 괄호 안의 조건을 만족하는 Post 레코드를 가져오라는 의미. 여기서는 pk(Primary Key) 의 값이 single_post_page() 함수의 매개변수로 받은 pk 값과 같은 레코드를 가져오라는 의미

    return render( # post 에서 가져온 레코드 하나를 blog/single_post_page.html에 담아 렌더링
        request,
        'blog/single_post_page.html',
        {
            'post': post,
        }
    )

 

이후 상세페이지의 html 파일인 blog/templates/blog/single_post_page.html 을 만든다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>{{ post.title }} - Blog</title>
</head>

<body>
<nav>
    <a href="/blog/">Blog</a>
</nav>
<h1>{{ post.title }}</h1> <!-- 포스트 제목 !-->
<h4>{{ post.created_at }}</h4> <!-- 포스트 생성 시간 !-->
<p>{{ post.content }}</p> <!-- 포스트 내용 !-->
<hr/>
<h3>여긴 댓글 달 공간</h3>
</body>
</html>

 

그리고 blog/templates/blog/index.html 코드를 수정한다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
</head>

<body>
<h1>Blog</h1>
{% for p in posts %}
<hr/>
<h2><a href="{{ p.get_absolute_url }}">{{ p.title }}</a></h2> <!-- 포스트 제목, 클릭 시 상세내용 출력 !-->
<h4>{{ p.created_at }}</h4> <!-- 포스트 생성 시간 !-->
<p>{{ p.content }}</p> <!-- 포스트 내용 !-->
{% endfor %}
</body>
</html>

 

마지막으로 아래는 'http://127.0.0.1:8000/blog/' 의 페이지 소스인데, 포스트 제목의 <a> 태그를 보면 <a href=""> 와 같이 비어있는 것을 볼 수 있다. 

 

 

여기에 데이터를 넣기 위해 blog/modes.py 를 수정한다.

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self): # post 제목과 번호 보여주기
        return f'[{self.pk}]{self.title}'

    def get_absolute_url(self): # Post 제목 클릭 시 상세 페이지로 이동
        return f'/blog/{self.pk}/'

 

그러면 아래와 같이 상세페이지로의 이동이 가능해진다.

 

3. single_pages

single_pages 앱은 대문 페이지와 자기 소개 페이지의 기능을 수행한다.

 

대문페이지와 자기소개 페이지를 만들기 위해 single_pages/urls.py 의 코드를 작성한다.

from django.urls import path
from . import views

urlpatterns = [ # url 패턴에 대한 명령
    path('about_me/', views.about_me),  # 도메인 뒤에 about_me/ 가 붙어 있을 때는 views.py 에 있는 about_me() 함수 실행
    path('', views.landing), # 도메인 뒤에 아무 것도 없을 때는 views.py 에 있는 landing() 함수 실행
]

 

single_pages/urls.py 를 작성했으니 single_pages/views.py 또한 작성해준다.

from django.shortcuts import render

# Create your views here.
def landing(request): # landing.html 페이지를 보여줌
    return render(
        request,
        'single_pages/landing.html'
    )

def about_me(request): # about_me.html 페이지를 보여줌
    return render(
        request,
        'single_pages/about_me.html'
    )

 

당연히 웹 페이지에 시각화하기 위해 대문 페이지.html, 자기소개 페이지.html 또한 작성해야한다.

 

우선 대문 페이지인 single_pages/templates/single_pages/landing.html 을 만든다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>이형석입니다!</title>
</head>

<body>
<nav>
    <a href="/blog/">Blog</a>
    <a href="/about_me/">About_me</a>
</nav>

<h1>안녕하세요. 이형석입니다.</h1>
<h2>대문페이지</h2>
<h3>아직 만들지 않음</h3>

</body>
</html>

 

그리고 자기소개 페이지인 single_pages/templates/single_pages/about_me.html 을 만든다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>개발자 이형석입니다.</title>
</head>

<body>
<nav>
    <a href="/blog/">Blog</a>
    <a href="/about_me/">About me</a>
</nav>

<h1>안녕하세요. 이형석입니다.</h1>
<h2>이력</h2>
<h3>Portfolio</h3>
<h3>아직 공사중입니다.</h3>
</body>
</html>

 

이후 'http://127.0.0.1:8000/' 에 접속하면 아래와 같이 보여준다.

 

여기서 About_me 를 클릭하면 자기소개 페이지를 보여준다.

 

 

'캡스톤 > Django' 카테고리의 다른 글

[Django] 포스트 목록 페이지에 부트스트랩 적용  (0) 2022.03.18
[Django] CBV로 페이지 만들기  (0) 2022.03.11
[Django] 모델 생성  (0) 2022.03.10
[Django] 블로그 앱, 페이지 앱 만들기  (0) 2022.03.10
[Django] Django 구조  (0) 2022.03.10
'캡스톤/Django' 카테고리의 다른 글
  • [Django] 포스트 목록 페이지에 부트스트랩 적용
  • [Django] CBV로 페이지 만들기
  • [Django] 모델 생성
  • [Django] 블로그 앱, 페이지 앱 만들기
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[Django] URL 설정
상단으로

티스토리툴바