Django
Database

html화면에서 models 데이터 조회

- Django 블로그 만들기

Jan. 11, 2023, 9:27 p.m.

안녕하세요?

지난 포스트에서는 django model 을 이용하여 Article이라는 클래스(DB에서는 테이블)을 만들었고,

여기에 데이터를 입력할 수 있는 admin 페이지 설정을 해보았습니다.

 

이번 글에서는 Article 에 데이터를 실제로 넣어보고, 

html 화면에서 이 정보를 가져올 수 있도록 해보겠습니다.

 

Article(model) 데이터 생성

먼저, admin 페이지로 들어가서

Article 항목에 'ADD' 버튼을 눌러서 아래와 같이 Article 작성을 위한 페이지를 띄웁니다.

 

 

다 입력한 후 'SAVE'버튼을 누르면 저장이 되고,

아래와 같이 입력된 Article 목록이 뜹니다. 

해당 목록에서 입력된 건을 클릭해보면 수정하는 페이지로 연결됩니다.

하지만 저희가 만들고 있는 블로그 사이트로 들어가면,

방금 전 입력한 글은 찾아볼 수 없습니다.

 

이는 html 파일에는 Article 모델 데이터가 나오도록 연결을 해놓지 않아서 그렇습니다.

이제 html 파일에 모델 데이터를 끌어다가 쓸 수 있도록 수정할 것입니다.

 

views.py 파일 수정

blog 어플리케이션을 만들었을 때 생성된 파일 중에 views.py 라는 파일이 있습니다.

views.py 파일은 MVC 패턴에서 VIEW를 담당하는 것으로,(MVC 패턴에 대한 자세한 설명 : MVC 패턴이란?)

쉽게 말하자면 URL 요청을 받은 후 데이터를 읽고, 이 데이터를 어떻게 보여줄 것인지 처리하는 부분이라고 보시면 됩니다.

해당 파일을 아래와 같이 수정합니다.

from django.shortcuts import render
from .models import Article

# Create your views here.
def index(request):
    matching_article = Article.objects.all()

    return render(request=request,
                  template_name='index.html',
                  context={"objects": matching_article}
                  )

여기서 Article.objects.all() 이라는 부분은 Article 모델의 클래스 중 모든 객체 데이터를 가져오겠다는 것입니다.

render 함수에서 template_name 부분은 해당 요청을 받이면 index.html 파일을 띄워준다는 것이고,

context 부분은 화면에 보낼 변수를 지정하는 것으로, objects 라는 변수에 조회된 matching_article 객체를 보내주는 것입니다.

 

 

urls.py 파일 수정

이전에 Test/TestProject/TestProject 경로에 있는 urls.py 파일을 아래와 같이 입력한 적이 있는데요,

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from .views import *


urlpatterns = [
    path('', views.index),
    path('index', index, name='index'), 
    path('about', about, name='about'), 
    path('post', post, name='post'), 
    path('contact', contact, name='contact'), 
    path('admin/', admin.site.urls),

]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

이 urls.py 파일을  두개로 나눠주는 작업을 할 겁니다.

먼저 해당 파일을 복사하여 Test/TestProject/blog 경로에 복사해주시고,

Test/TestProject/TestProject 경로의 urls.py 파일은 아래와 같이 수정합니다.

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from .views import *


urlpatterns = [
    path('', include('blog.urls')), #수정된부분
    path('about', about, name='about'),
    path('post', post, name='post'),
    path('contact', contact, name='contact'),
    path('admin/', admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

여기서 #수정된부분 행은 '' 으로 요청을 받으면, blog폴더의 urls 파일을 참조하겠다라는 의미입니다.

그리고 index 로 요청을 받던 행도 지웠습니다.

 

blog 폴더 밑이 urls.py 파일은 아래와 같이 수정합니다.

from django.contrib import admin
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
from .views import *


urlpatterns = [
    path('', views.index),
    path('index', index, name='index'),
]

index 로 요청을 받는 경우에는 이제 blog 폴더의 urls.py 파일로 요청이 오고,

이는 blog 폴더의 views.py 파일의 index 함수를 타도록 연결되었습니다.

 

 

html 파일 수정

index.html 파일을 열고 <!--Main Content--> 라는 부분을 찾아서 아래와 같이 수정해줍니다.

<!-- Main Content-->
        <div class="container px-4 px-lg-5">
            <div class="row gx-4 gx-lg-5 justify-content-center">
                <div class="col-md-10 col-lg-8 col-xl-7">
                    {% for object in objects %}
                        <div class="preview">
                            <blog class="media content-section customhover" style="height: 95%;">
                                <div class="media-body">
                                    <a href="/post/{{object.slug}}">
                                        <!--<img class="img-fluid" src="/">-->
                                        <h2 class="post-title" >{{ object.title }} </h2>
                                        <h3 class="post-subtitle">{{ object.subtitle }}</h3>
                                    </a>
                                    <p class="post-meta">
                                            Posted by
                                            <a href="/post/{{object.slug}}">Sanlab</a>
                                            on {{ object.published }}
                                    </p>
                                   
                                </div>
                            </blog>
                        </div>
                        <!-- Divider-->
                        <hr class="my-4" />
                    {% endfor %}
                    <!-- Post preview-->
                    <!-- Pager-->
                    <div class="d-flex justify-content-end mb-4"><a class="btn btn-primary text-uppercase" href="#!">Older Posts →</a></div>
                </div>
            </div>
        </div>
        <!-- Footer-->

위의 파일에서는 views.py 파일에서 objects라는 변수로 던져준 부분을 받아서 

해당 객체를 for문을 돌려서 각 object마다 데이터를 뿌려주는 형식입니다.

이렇게 저장을 한후 다시 블로그에 들어가서 새로고침을 하면 아래와 같이

저희가 입력한 테스트 글이 잘 보이는 것이 확인됩니다.

 

근데 막상 포스트를 누르면 아래와 같이 404 에러가 뜹니다.

이는 아직 포스트 클릭에 대한 url 설정이 안되어 있기 때문인데요,

이는 다음 포스트에서 설정해보도록 하겠습니다.

 

Reference


Project

Comments


Related Posts