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 |