Juni_Dev_log

블로그 앱 만들기 ② "개발 코딩하기 - 뼈대 만들기&모델 코딩하기" with Django 본문

Project/Blog APP 만들기 (Django)

블로그 앱 만들기 ② "개발 코딩하기 - 뼈대 만들기&모델 코딩하기" with Django

Juni_K 2020. 8. 21. 23:23

① 뼈대 만들기

애플리케이션 만들기부터 시작하면 된다.

(vDjBook) python manage.py startapp blog

블로그 앱에 대한 설정 클래스를 settings.py 파일에 등록한다.

'blog.apps.BlogConfig'

 


② 모델 코딩하기

블로그 앱은 Post 테이블 하나만 필요하다.

테이블은 models.py 에서 정의하면된다. 앞에서 설계한 테이블의 정의 뿐만 아니라, 필요한 메서드도 같이 정의한다.

테이블을 클래스로 정의하는 ORM 기법 덕분에 원한다면 모델 클래스와 관련된 메서드도 같이 정의할 수 있다.

 

(blog/models.py)

from django.db import models
from django.urls import reverse

# Create your models here.
class Post(models.Model):
    title = models.CharField(verbose_name='TITLE', max_length=50)
    slug = models.SlugField('SLUG', unique=True, allow_unicode=True, help_text='one word for title alias.')
    description = models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple description text.')
    content = models.TextField('CONTENT')
    create_dt = models.DateTimeField('CREATE DATE', auto_now_add=True)
    modify_dt = models.DateTimeField('MODIFY DATE', auto_now=True)

    class Meta:
        verbose_name='post'
        verbose_name_plural='posts'
        db_table = 'blog_posts'
        ordering = ('-modify_dt')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=(self.slug,))

    def get_previous(self):
        return self.get_previous_by_modify_dt()

    def get_next(self):
        return self.get_next_by_modify_dt()
  • reverse() 함수를 사용하기 위한 임포트. reverse() 함수는 URL 패턴을 만들어주는 장고의 내장 함수이다.

  • title 칼럼은 CharField 이므로 한 줄로 입력된다. 최대 길이는 50글자이다.

  • slug 칼럼은 제목의 별칭이라고 보면된다. unique 옵션을 추가해 특정 포스트를 검색할 때 기본키 대신 사용된다.

    allow_unicode 옵션을 추가하면, 한글 처리가 가능하다. help_text 는 해당 칼럼을 설명해주는 문구로 폼 화면에 나타난다. Admin 사이트에서 확인할 수 있다.

★ 슬러그(Slug)란?

슬러그는 페이지나 포스트를 설명하는 핵심 단어의 집합이다. 원래 신문이나 잡지 등에서 제목을 쓸 때, 중요한 의미를 포함하는 단어만 이용해 제목을 작성하는 법을 말한다.

보통 슬러그는 페이지나 포스트의 제목에서 조사, 전치사, 쉼표, 마침표 등을 빼고 띄어쓰기는 하이픈(-)으로 대체해서 만들며 URL 에 사용된다.

슬러그를 URL에 사용함으로써, 검색 엔진에서 더 빨리 페이지를 찾아주고 검색엔진의 정확도를 높여준다.
★ SlugField 필드 타입

슬러그는 보통 제목의 단어들을 하이픈으로 연결해 생성하며, URL에서 pk 대신 사용되는 경우가 많다.

pk 를 사용하면 숫자로만 되어있고, 그 내용을 유추하기는 어렵지만, 슬러그를 사용하면 보통의 단어들이라서 이해하기 쉽기 때문이다.

SlugField 필드의 디폴트 길이는 50이며, 해당 필드에는 인덱스가 디폴트로 생성된다.
  • description 칼럼은 빈칸(blank)도 가능하다.

  • content 칼럼은 TestField 를 사용했기에, 여러줄 입력도 가능하다.

  • create_dt 컬럼은 날짜와 시간을 입력하는 DateTimeField 이며, auto_now_add 속성은 객체가 생성될 때의 시각을 자동으로 기록해준다.

  • modify_dt 칼럼은 날짜와 시간을 입력하는 DateTimeField이며, auto_now 속성은 객체가 데이터베이스에 저장될 때의 시각을 자동으로 기록하게 한다. 즉, 객체가 변경될 떄의 시각이 기록된다.

  • 필드 속성 외에 필요한 파라미터가 있으면 Meta 내부 클래스로 정의한다.

  • 테이블의 별칭은 단수와 복수로 가질 수 있는데, 단수 별칭은 'post' 로 한다.

  • 테이블의 복수 별칭을 'posts'로 한다.

  • 데이터베이스에 저장되는 테이블의 이름을 'blog_posts'로 지정한다. 이 부분을 생략하면 디폴트는 '앱명-모델클래스명' 으로 저장된다. db_table 을 하지 않았다면 blog_post 가 되는 것이다.

  • 모델 객체의 리스트 출력 시, modify_dt 칼럼을 기준으로 내림차순으로 정렬한다. ordering = ('-modify_dt')

  • 객체의 문자열 표현 메소드인 __str__은 객체의 문자열을 객체, title 속성으로 표시한다.

  • get_absolute_url() 메소드는 메소드가 정의된 객체를 지징하는 URL 을 반환한다. 메소드 내에서 장고의 내장함수인 reverse() 를 호출한다.

  • get_previous() 메소드는 메소드 내에서 장고의 내장 함수인 get_previous_by_modify_dt() 를 호출한다. modify_dt 를 기준으로 최신 포스트를 반환한다.

★ 모델 클래스의 메소드 사용

모델 클래스에 정의한, get_absoulte_url() , get_previous(), get_next() 메소드들을 템플릿 파일에서 사용하고 있다.

또한, Admin 사이트에도 보이도록, admin.py 파일에 등록한다.

Admin 사이트의 모습을 정의하는 PostAdmin 클래스도 정의한다.

 

(blog/admin.py)

from django.contrib import admin
from blog.models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
	list_display = ('id', 'title', 'modify_dt')
	list_filter = ('modify_dt',)
	search_fields = ('title', 'content')
	prepopulated_fields = {'slug':('title',)}
  • admin.site.register() 함수를 사용해도 되지만, 데코레이터를 사용하면 더 간단하다.

  • PostAdmin 클래스는 Post 클래스가 Admin 사이트에서 어떤 모습으로 보여줄지를 정의하는 클래스이다.

  • Post 객체를 보여줄 떄, id와 title, modify_dt 를 화면에 출력하라고 지정한다.

  • modify_dt 컬럼을 사용하는 필터 사이드바를 보여주도록 지정한다.

  • 검색박스를 표시하고, 입력된 단어는 title 과 content 칼럼에서 검색하도록 한다.

  • slug 필드는 title 필드를 사용해 미리 채워지도록 한다.

테이블의 신규 생성, 테이블의 정의 변경 등 데이터베이스에 변경이 필요한 사항이 생기면, 이를 데이터베이스에 실제로 반영해주는 작업을 해야한다.

python manage.py makemigrations blog
python manage.py migrate
만약, 또 pymysql 모듈을 설치하라는 알림이나 mysqlclinet 버전이 새로운 것이 필요하다는 내용이 나오면,

C:\Users\ASUS\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\django\db\backends\mysql

내 가상환경이 있는 곳에서 base.py 에서 해당 내용을 수정하면 된다. (vDjBook 이 있는 곳이 아니라!!!)

models.py 파일에서 테이블을 정의하고 이를 데이터베이스에 반영하는 명령을 실행했다.

Admin 사이트로 접속해보자. runserver 를 실행하고 접속한다.

http://127.0.0.1:8000/admin/

Django Admin Posts 작성 화면

이러한 UI 를 확인할 수 있다.

 


(이전 포스팅)

2020/08/20 - [Project/Blog APP 만들기 (Django)] - 블로그 앱 만들기 ① "애플리케이션 설계하기" with Django

 

블로그 앱 만들기 ① "애플리케이션 설계하기" with Django

블로그 사이트가 늘어나고 블로그의 기능도 다양해지면서, 블로그 앱은 웹 프로그래밍을 배우는 사람들이 필수적으로 공부해야 한느 애플리케이션이 되었다. 블로그의 기본 기능이라고 할 수 �

juni-dev-log.tistory.com

(다음 포스팅)

2020/08/21 - [Project/Blog APP 만들기 (Django)] - 블로그 앱 만들기 ③ "개발 코딩하기 - URLconf 코딩하기 & View 코딩하기" with Django

 

블로그 앱 만들기 ③ "개발 코딩하기 - URLconf 코딩하기 & View 코딩하기" with Django

③ URLconf 코딩하기 ROOT_URLCONF 와 APP_URLCONF 2개의 파일에 코딩을 할 것이다. 이번 블로그앱도 mysite/urls.py 와 blog/urls.py 2개의 파일에 코딩을 하고, 2장에서 작성한 북마크앱도 mysite/urls.py 와 bo..

juni-dev-log.tistory.com

 

Comments