본문 바로가기

문돌이 존버/Django 스터디

Mac 버전 장고 데이터베이스 관리 3탄

반응형

이전에 views.py 파일에 작성했던 write_world 는 지우거나 주석처리하시고 class Post를 활용하여 새로운 함수 post_example 을 생성합니다.(아래의 views.py 파일 코드는 단계별 예시로 글을 읽다보면 다시 대폭 수정되었을 것입니다.)

import datetime

from django.shortcuts import render, HttpResponse
from .models import Post

# Create your views here.
def post_example(request):
    post_example = Post.objects.all()
    output = '<br/>'.join([a.title for a in post_example])
    return HttpResponse(output)
    
"""
def write_world(request): 
	now_time = str(datetime.datetime.now()) 
    name = request.GET.get('name')
    if not name:
    	name = 'Guests' 
    return HttpResponse( 
    	"<h1> Hi, django world {}</h1>".format(name) 
        + '<br/><br/>' 
        + now_time 
        )
 """
python manage.py shell
>>> from myapp.models import *
>>> Post
>>> Post.objects.create(title='오늘 하루도 시작', content='열심히 코딩해봅시다')
>>> Post.objects.count() # 포스트 갯수 출력

myapp 폴더 안에 templates 라는 새로운 디렉토리를 생성하고 templates 안에 index.html 파일을 생성해줍니다. 그 전에 잠깐 장고의 문법을 간단하게 살펴봅시다. 

{% if 조건문 %}
{% else %}
{% endif %} # django에선 if 문이 끝났다는 것을 표시해주어야 합니다. 
{% for el in iterable %}
{% endfor %}

아래는 index.html 예시입니다. 내용은 자유롭게 바꾸시기 바랍니다. 

<h1> 장고 블로그 꾸미기 </h1>

{% if post_list %}
<ul>
    {% for post in post_example %}
    <li>{{ post.title }}</li> # 참조를 할 때는 중괄호 2개 필요 {{ }}
    {% endfor %}
</ul>
{% else %}
<h2> 아직 포스팅이 없습니다. </h2>
{% endif %}

이후 views.py 파일을 아래와 같이 수정합니다. 댓글을 확인하기 위한 post_comment 함수를 추가해주었습니다.  

import datetime

from django.shortcuts import render, HttpResponse
from .models import Post

# Create your views here.
def post_example(request):
    post_example = Post.objects.all()
    context = {'post_list': post_example} # context 딕셔너리 사용
    
    # 딕셔너리 key값인 'post_list'가 index.html로 넘겨지는 것 
    return render(request, 'index.html', context)
    
def post_comment(request, post_id):
    post = Post.objects.get(id=post_id)
    comments = post.comment_set.all()
    context = {
        'post': post,
        'comments': comments
    }
    return render(request, 'post.html', context)

templates 안에 post.html 이란 파일을 생성하고 아래와 같이 입력합니다. 

<h1>{{ post.title }}</h1>
<p>{{ post.create_date }} / {{ post.modify_date }}</p>

<div>
{{ post.content }}
</div>

<div>
    <ul>
    {% for comment in comments %}
    	<li>
    {{ comment.text }} {{ comment.create_date }}
    	</li>
    {% endfor %}
    </ul>
</div>

다음으로 myapp 폴더 안에 있는 urls.py 파일을 클릭하여 views.py 내의 함수들을 불러옵니다.  

urlpatterns = [
    path("", views.post_example),
    path("<int:post_id>/", views.post_comment) # 가변적인 변수를 받겠다는 의미
]

이렇게 다 세팅하고 나서 python manage.py shell 을 통해 파이썬 환경에 진입 후 원하는 title, content, comment 내용을 작성해주면 되겠죠? 마지막으로 index.html 파일에서 추가 옵션이 있는데요. 방금 작성했던 코드에 하이퍼링크를 설정하는 것으로 아래처럼 작성해주면 됩니다. 

<ul>
    {% for post in post_list %}
    <li>
        <a href="{% url 'detail' post.id %}">
        {{ post.title }} </a>
    </li> 
    {% endfor %}
</ul>

여기서 'detail'은 myapp 폴더의 urls.py 파일에서 설정할 수 있습니다. name="detail" 만 간단하게 추가해주면 됩니다. 주목할 점은 url 주소가 <int:post_id> 라고 설정된 것입니다. 댓글을 보려면 특정 포스트가 있어야 하고, 각 포스트는 저마다 id를 가지고 있겠죠. 따라서 이전에 설정한 foreignkey 특성상 post_id 형식을 사용하여 url에 매칭한 것입니다.   

urlpatterns = [
    path("", views.post_list), 
    path("<int:post_id>/", views.post_detail, name="detail")
]

이렇게 세팅을 모두 완료하고 나면 아래와 같은 웹 페이지를 볼 수 있을 것입니다. 

 

728x90
반응형