FBV (Function Based View)์™€ CBV (Class Based View)

210724

FBV (Function Based View)๋กœ ๋ธ”๋กœ๊ทธ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ํด๋”์— ์žˆ๋Š” urls.py ์—๋Š” admin/ ๋งŒ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 127.0.0.1/blog ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ€๋ฉด 404 ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

urls.py ์— ์žˆ๋Š” urlpatterns ์€ ์ด์ •ํ‘œ์˜ ์˜๋ฏธ. ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ์—ฌ๊ธฐ์— blog/ ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

urls.py

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

urlpatterns = [
    path('blog/', include('blog.urls')),
    path('admin/', admin.site.urls),
]
  • ์ด ๋•Œ include ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ import ํ•ด์ค˜์•ผ ํ•œ๋‹ค

  • blog ์•ฑ ํด๋”์—๋Š” ์•„์ง urls ๋ผ๋Š” ํŒŒ์ผ์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

blog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]
  • ์ด ๋•Œ views.index ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ views.py ์—์„œ index ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • ์ง€๊ธˆ์ฒ˜๋Ÿผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด FBV ๋ฐฉ๋ฒ•

blog/views.py

from django.shortcuts import render

def index(request):
    return render(
        request, 
        'blog/index.html',
    )
  • blog์˜ index.html์„ ๊ฐ€์ง€๊ณ  ๋ Œ๋”๋ง ํ•˜๋ผ๋Š” ๋œป

  • ๋”ฐ๋ผ์„œ index.html์ด ๋˜ ํ•„์š”ํ•˜๋‹ค.

    • templates ๋ผ๋Š” ํด๋” ์•ˆ์—, blog ๋ผ๋Š” ํด๋” ์•ˆ์— index.html์„ ๋งŒ๋“ ๋‹ค

    • templates/blog/index.html

    • ์•ฑ์˜ ๋…๋ฆฝ์„ฑ์„ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์ž‘์—…ํ•˜๋ฉฐ ์ถ”ํ›„์— ์ถ”๊ฐ€ ์„ค๋ช…

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>

https://m.blog.naver.com/nuberus/221747636515
  • ์ง€๊ธˆ๊นŒ์ง€ ํ•œ ์ž‘์—…์€ ํด๋ผ์ด์–ธํŠธ์—์„œ View๋กœ ์š”์ฒญ์„ํ•˜๊ณ  View๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ๋ Œ๋”๋ง ํ•œ ํ›„ ์‘๋‹ต์„ ์ค€ ๊ณผ์ •์ด๋‹ค.

  • ์ด์ œ Model์—์„œ DB๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด์„œ ์‘๋‹ต์„ ์ฃผ๋Š” ๊ณผ์ •์„ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

blog/views.py

from django.shortcuts import render
from .models import Post

def index(request):
    posts = Post.objects.all()
    return render(
        request,
        'blog/index.html',
        {
            'posts' : posts,
        },
    )
  • ๋ Œ๋”๋ง์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ posts ๋ผ๋Š” dictionary๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

    • ์ด posts๋Š” models.py์— ์žˆ๋Š” post class์ด๋‹ค.

์ง€๊ธˆ๋ถ€ํ„ฐ์˜ ํŒŒ์ผ๋“ค์€ ํŠน๋ณ„ํ•œ ๋ช…์‹œ๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋‘ 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 %}
        <h3>{{ p }}</h3>
    {% endfor %}
</body>
</html>
  • 10-12

    • html์—์„œ ๋™์ ์–ธ์–ด๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ๋” ์žฅ๊ณ ์—์„œ ์ง€์›ํ•œ๋‹ค.

    • for๋ฌธ์„ ์‹œ์ž‘ํ•  ๋•Œ์™€ ๋๋‚  ๋•Œ {% %} ๋ฅผ ์จ์ค€๋‹ค.

    • posts๋Š” views.py์— ์žˆ๋Š” dictionary ๊ฐ’์œผ๋กœ 'posts' key์— ๋Œ€ํ•œ value ๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ <h3> ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜๊ฒŒ ํ•œ๋‹ค.

  • ์ด ๋•Œ ์–ด๋–ป๊ฒŒ p ๋ฅผ ๋ถ€๋ฅด๊ธฐ๋งŒ ํ•ด๋„ db์— ์ €์žฅ๋œ ๋‚ด์šฉ์ด ๋‹ค ๋œฐ๊นŒ?

    • ์ด์œ ๋Š” models.py์— ์ •์˜๋˜์–ด์žˆ๋Š” __str__ ํ•จ์ˆ˜ ๋•Œ๋ฌธ

models.py

    def __str__(self):
        return f"{self.pk} {self.title}"

์ข€ ๋” ์ถ”๊ฐ€ํ•ด๋ณด์ž.

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/>
        <h3>{{ p }}</h3>
        <h4>{{ p.create_at }}</h4>
        <p> {{ p.context }}</p>
    {% endfor %}
</body>
</html>

๋˜ํ•œ, posts์˜ ๊ฐ’๋“ค์„ ํŠน์ • ํ…Œ์ด๋ธ”๊ฐ’์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

views.py

# pk ์ˆœ
posts = Post.objects.all().order_by('pk')

# pk ์—ญ์ˆœ
posts = Post.objects.all().order_by('-pk')
  • ์—ฌ๊ธฐ์„œ objects.all()์€ ์ฟผ๋ฆฌ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

FBV (Function Based View)๋กœ ๋ธ”๋กœ๊ทธ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

blog ํŽ˜์ด์ง€์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ๋ˆŒ๋ €์„ ๋•Œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ณผ์ •์„ ๊ตฌ์„ฑํ•  ๊ฒƒ์ž„

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<int:pk>/', views.single_post_page)
    path('', views.index),
]
  • <> ์•ˆ์—๋Š” ์ž๋ฃŒํ˜•์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ pk๊ฐ€ ์ •์ˆ˜๋กœ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€๋Šฅ

  • views.py ์— single_post_page ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž„

views.py

def single_post_page(request, pk):
    post = Post.objects.get(pk=pk)
    return render(
        request,
        'blog/single_page.html',
        {
            'post': post,
        }
    )

single_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>
    <p>์—ฌ๊ธฐ์— ๋Œ“๊ธ€์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?</p>
</body>
</html>

์—ฌ๊ธฐ์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋“  /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/>
        <h3>><a href="{{ p.get_absolute_url }}">{{ p }}</a></h3>
        <h4>{{ p.create_at }}</h4>
        <p> {{ p.context }}</p>
    {% endfor %}
</body>
</html>
  • ์—ฌ๊ธฐ์„œ p.get_absolute_url ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ model.py ์—์„œ ์ •์˜ํ•ด์ค˜์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์ด์ง€๋งŒ ์žฅ๊ณ ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

    • ์žฅ๊ณ ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค๋Š” ๋œป

models.py

    def get_absolute_url(self):
        return f'/blog/{self.pk}'

๊ฐ ํฌ์ŠคํŠธ์—์„œ /blog๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ admin ํŽ˜์ด์ง€์—์„œ๋„ view on site ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

FBV๋กœ ๋Œ€๋ฌธ ํŽ˜์ด์ง€ ์ž๊ธฐ์†Œ๊ฐœํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

127.0.0.1/8000 ์—์„œ blog๋‚˜ admin์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋Œ€๋ฌธ ํŽ˜์ด์ง€๋„ ๋งˆ๋ จํ•ด์ฃผ์ž.

urls.py

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

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

single_pages/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.landing),
]

single_pages/views.py

from django.shortcuts import render

def landing(request):
    return render(
        request,
        'single_pages/landing.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>

CBV๋กœ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

์žฅ๊ณ ์—์„œ ์ด๋Ÿฌํ•œ ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€๋“ค์„ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

blog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<int:pk>/', views.single_post_page),
    path('', views.PostList.as_view())
    # 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
    template_name = "blog/index.html"

# def index(request):
#     posts = Post.objects.all().order_by('pk')
#     return render(
#         request,
#         'blog/index.html',
#         {
#             'posts' : posts,
#         },
#     )

์ด ๋•Œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด,

์•„๋ฌด๊ฒƒ๋„ ๋œจ์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š”,

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/>
        <h3>><a href="{{ p.get_absolute_url }}">{{ p }}</a></h3>
        <h4>{{ p.create_at }}</h4>
        <p> {{ p.context }}</p>
    {% endfor %}
</body>
</html>

๋ฐ˜๋ณต๋ฌธ์—์„œ posts์— ํ•ด๋‹นํ•˜๋Š” dictionary๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฅ๊ณ ์—์„œ ์ œ๊ณตํ•˜๋Š” CBV๋Š” dictionary ๋ณ€์ˆ˜๋ฅผ post_list๋กœ ์ •์˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

{% for p in post_list %}

๋˜ํ•œ, views.py ์—์„œ template_name์„ ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š๊ณ  template ํŒŒ์ผ ์ด๋ฆ„์„ post_list ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋˜, ์ˆœ์„œ๋„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

views.py

class PostList(ListView):
    model = Post
    ordering = '-pk'

CBV๋กœ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ single_page๋„ ํด๋ž˜์Šค๋กœ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

views.py

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

class PostDetail(DetailView):
    model = Post

# def single_post_page(request, pk):
#     post = Post.objects.get(pk=pk)
#     return render(
#         request,
#         'blog/single_page.html',
#         {
#             'post': post,
#         }
#     )

๊ทธ๋ฆฌ๊ณ  ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ์ด๋ฆ„์„ post_detail.html ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, url๋„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋.

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<int:pk>/', views.PostDetail.as_view()),
    # path('<int:pk>/', views.single_post_page),
    path('', views.PostList.as_view())
    # path('', views.index),
]

์žฅ๊ณ ์—์„œ๋Š” CBV๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๊ฒƒ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ์†Œ๋ชจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— CBV๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค!

Last updated

Was this helpful?