Django를 사용하여 처음부터 블로그 구축 III

2024. 2. 10. 21:16python/intermediate

In [ ]:
%cd django-blog
!source venv/bin/activate
!python -m pip install Django
!python manage.py runserver​
In [ ]:
!python manage.py startapp blog

 

모델 표현 제어

현재 Django 관리 사이트에는 이 섹션에서 다루게 될 두 가지 단점이 있습니다. 둘 다 모델 표현과 관련이 있습니다. http://localhost:8000/admin 에 가서 찾을 수 있는지 확인하세요. 또한 아래에서 접을 수 있는 항목을 클릭할 수도 있습니다.

<두 가지 모델 표현의 단점>

첫 번째 단점은 모델에 대한 링크입니다 Category. 현재 텍스트에는 올바른 "Categories" 대신 "Categorys"라고 표시되어 있습니다.

 

 

다른 단점은 블로그 게시물과 카테고리가 제목 대신 개체 표현을 표시한다는 것입니다.

 

이와 같은 모델 표현을 사용하면 편집을 원할 때 어떤 게시물이나 카테고리를 클릭해야 하는지 알기가 어렵습니다.

모델 표현을 개선하려면, models.py를 열고 아래 강조 표시된 코드를 추가하세요.

In [ ]:
# blog/models.py

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=30)

    class Meta:
        verbose_name_plural = "categories"

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    categories = models.ManyToManyField("Category", related_name="posts")

    def __str__(self):
        return self.title

class Comment(models.Model):
    author = models.CharField(max_length=60)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey("Post", on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.author} on '{self.post}'"

일반적인 Python 클래스 와 마찬가지로 모델 클래스에 .__str()__ 메서드를 추가하여 개체에 대한 더 나은 문자열 표현을 제공 할 수 있습니다. 카테고리의 경우 이름을 표시하려고 합니다. 게시물의 경우 제목이 필요합니다. 댓글의 경우 댓글 작성자의 이름과 댓글을 단 게시물을 표시합니다.

Category 클래스의 잘못된 복수형을 수정하려면 클래스의 복수형 이름을 제어하는 Meta 클래스를 추가합니다. 기본적으로 Django는 모델 이름 끝에 소문자 s를 추가합니다. post 복수형의 경우 이것은 완벽하게 작동합니다. 카테고리의 경우 올바른 철자를 사용하여 명시적으로 verbose_name_plural를 정의해야 합니다 .

변경사항이 제대로 작동하는지 확인하려면 http://localhost:8000/admin다음을 다시 방문하세요.

 

 

두 가지 단점을 모두 해결했으며 모델이 사람이 읽을 수 있는 방식으로 표현되었습니다. 다음으로 관리 영역에서 블로그의 사용자가 접하는 부분으로 이동합니다.

뷰로 논리 처리

Django의 뷰는 앱 디렉터리의 views.py 파일 내에 있는 함수 또는 클래스의 모음입니다. 각 함수 또는 클래스는 사용자가 다른 URL을 방문할 때마다 처리되는 논리를 처리합니다.

blog/ 디렉터리의 views.py 파일에 블로그에 대한 세 가지 보기 기능을 만들어야 합니다.

  • blog_index() : 모든 게시물 목록이 표시됩니다.
  • blog_detail() : 전체 게시물이 표시됩니다. 나중에 이 보기에는 기존 댓글과 사용자가 새 댓글을 작성할 수 있는 양식도 표시됩니다.
  • blog_category() : blog_index과 유사 하지만 표시되는 게시물은 사용자가 선택한 특정 카테고리에만 해당됩니다.

views.py에 필요한 가져오기 및 blog_index() 기능을 추가하여 시작하세요.

In [ ]:
# blog/views.py

from django.shortcuts import render
from blog.models import Post, Comment

def blog_index(request):
    posts = Post.objects.all().order_by("-created_on")
    context = {
        "posts": posts,
    }
    return render(request, "blog/index.html", context)

4행에서는 Post및 Comment모델을 가져옵니다. 7행에서는 view 함수 내에서 데이터베이스의 모든 게시물을 포함하는 Queryset을 얻습니다. 쿼리 세트는 쿼리와 일치하는 데이터베이스의 모든 개체 모음입니다.

Queryset에 .order_by() 메소드를 추가하면 주어진 인수에 따라 객체가 정렬됩니다. 빼기 기호( -)는 Django가 가장 작은 값이 아닌 가장 큰 값으로 시작하도록 지시합니다. 이렇게 하면 최근에 작성된 게시물을 먼저 얻을 수 있습니다.

마지막으로 context 사전을 정의 하고 index.html라는 템플릿을 렌더링합니다. 아직 Django 템플릿에 대해 걱정하지 마세요. 다음 섹션에서 이를 생성하게 됩니다.

다음으로 blog_category()뷰를 생성할 수 있습니다. 이 보기 함수는 카테고리 이름을 인수로 사용하고 지정된 카테고리의 모든 게시물에 대해 Post 데이터베이스를 쿼리해야 합니다.

In [ ]:
# blog/views.py

# ...

def blog_category(request, category):
    posts = Post.objects.filter(
        categories__name__contains=category
    ).order_by("-created_on")
    context = {
        "category": category,
        "posts": posts,
    }
    return render(request, "blog/category.html", context)

6행에서는 Django Queryset 필터를 사용합니다 . 필터의 인수는 Django에게 객체를 검색하기 위해 어떤 조건이 충족되어야 하는지 알려줍니다. 이 경우, view 함수의 인수에 지정된 이름에 해당하는 카테고리가 포함된 카테고리의 게시물만 원합니다. 다시 말하지만, .order_by()가장 최근 항목부터 시작하여 게시물의 순서를 지정하기 위해 8번째 줄을 사용하고 있습니다 .

그런 다음 이러한 게시물과 카테고리를 context 사전에 추가하고 category.html 템플릿을 렌더링합니다.

추가할 마지막 보기 기능은 blog_detail() 과 같습니다.

In [ ]:
# blog/views.py

# ...

def blog_detail(request, pk):
    post = Post.objects.get(pk=pk)
    comments = Comment.objects.filter(post=post)
    context = {
        "post": post,
        "comments": comments,
    }

    return render(request, "blog/detail.html", context)

blog_detail() view 함수는 기본 키 값인 pk를 인수로 사용하고 6행에서 주어진 pk와 같이 객체를 검색합니다. 기본 키는 데이터베이스 항목의 고유 식별자입니다. 이는 귀하가 제공한 특정 기본 키를 사용하여 단일 게시물을 요청한다는 의미입니다.

7행에서는 다시 Django 필터를 사용하여 해당 게시물에 할당된 모든 댓글을 검색합니다. Django 관리 사이트에서 주석을 생성하지 않은 경우 QuerySet은 비어 있지만, 지금은 괜찮습니다.

마지막으로 post 와 comments를 모두 context 사전에 추가하고 detail.html템플릿을 렌더링합니다. 뷰에서 참조하는 다른 템플릿과 마찬가지로 이 템플릿은 아직 존재하지 않습니다. 다음 섹션에서는 누락된 템플릿을 만듭니다.

 

출처 : https://realpython.com/build-a-blog-from-scratch-django/