하루에는

[Django]장고 Model, admin, Queryset 본문

Python, Django

[Django]장고 Model, admin, Queryset

에는 2019. 11. 27. 03:15

Overview

  • Post 모델 만들기
  • migration
  • admin(관리자)
  • queryset(쿼리셋)

Post 모델 만들기

이전 프로젝트에 post라는 앱을 만들겠습니다. manage.py가 있는 디렉터리에서 앱을 만들어주세요.

$ python manage.py startapp post

앱을 만들었으니 settings.py에 등록도 해줍니다.

Model 설계

post 앱은 Post라는 모델을 만들 것입니다. Post가 갖는 필드는 세 가지가 있습니다.

  1. 제목 : 문자열, 최대 길이 100자
  2. 내용 : 문자열
  3. 등록 날짜 : 날짜와 시간

장고의 모델은 클래스로 선언해 줍니다. post 앱의 models.py에 아래와 같이 써줍니다.

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField()

 

각 필드에 대한 설명은 아래와 같습니다.

  1. title : 제목 필드, 짧은 문자열, 최대 길이는 100
  2. content : 내용 필드, 긴 문자열
  3. created_at : 등록 날짜 및 시간

마이그레이션

models.py를 작성했으면 저장하고 마이그레이션을 해줘야 합니다.

$ python manage.py makemigrations
$ python manage.py migrate

makemigrations는 내가 짠 파이썬 코드를 DB가 알아들을수 있게 번역하는 명령어이고, migrate는 DB에 적용하라는 명령어입니다.

admin

admin은 장고에서 기본적으로 제공하는 기능입니다. 도메인 뒤에 admin을 붙이면 페이지를 볼 수 있습니다.

superuser를 만들어서 로그인하면 사이트를 쉽게 관리할 수 있습니다.

superuser 만들기

$ python manage.py createsuperuser

명령어를 치면 아래와 같이 계정을 만드는데 필요한 정보들을 입력할 수 있게 됩니다.

방금 만든 슈퍼유저 계정으로 로그인합니다.

Post 모델 admin에 등록

앱마다 admin.py라는 파일이 있습니다. post 앱에 admin.py에 아래와 같이 입력합니다.

from django.contrib import admin
from .models import Post

# Register your models here.
admin.site.register(Post)

*자동완성이 지원되는데 register를 쓸 때 Register라고 자동완성이 뜹니다. 그런데 Register라고 쓰면 저장이 안됩니다. register라고 작성해주세요.*

현재 경로의 models.py의 Post 클래스를 임포트해야 아래의 Post를 쓸 수 있습니다.

그리고 저장한 뒤, admin 페이지를 새로고침 합니다.

Post 모델이 등록된 걸 확인할 수 있습니다.

이런 식으로 여러 개 글을 써보았습니다.

Post object(1) 대신에 제목이 뜨도록 만들겠습니다. title을 리턴해주도록 바꾸겠습니다. 이 때는 인스턴스 출력 형식을 바꾸는 str 메소드를 사용합니다.

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateField()

		# 추가
    def __str__(self):
        return self.title

모델을 수정했으니 다시 migrate 해줍니다.

$ python manage.py migrate

 

Queryset

쿼리셋 : 모델에서 전달받은 객체 목록들

  • view가 로직을 처리하므로 View에서 객체 목록들인 쿼리셋을 받아서 사용해보기

post 앱에 templates 폴더를 만들고, postlist.html을 만듭니다.

프로젝트 폴더의 urls.py에도 코드를 추가합니다.

from django.contrib import admin
from django.urls import path
import picker.views
import post.views # 추가

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', picker.views.pick, name='pick'),
    path('list/', post.views.postlist, name='postlist'), # 추가
]
  • post 앱의 views.py 임포트
  • postlist path 추가

View 설정

post 앱의 views.py에 아래 코드를 작성합니다.

from django.shortcuts import render
from .models import Post

# Create your views here.
def postlist(request):
    posts = Post.objects.all()
    return render(request, 'postlist.html', {'posts': posts})
  • post.models에서 Post 클래스 임포트
  • posts 변수에 Post 모델의 objects들 전부를 담는다
    • Post.objects는 Post로 만들어진 객체들, all()을 사용해 전부 가져왔음
    • all() 외에도 count(), first(), last()등 메소드 존재
  • render 함수의 세 번째 인자에 posts 변수를 넘겨준다.

Template 설정

post 앱의 templates폴더 안에 있는 postlist.html에 아래와 같이 작성해줍니다.

<h1>등록된 글</h1>
{% for post in posts %}
    {{ post.title }}<br/>
    {{ post.content }}<br/>
    {{ post.created_at }}<br/>
    <br/>
{% endfor %}
  • for문은 템플릿 태그 사용
  • 템플릿 변수로 post의 속성들을 보여줌

서버를 돌려서 도메인 뒤에 list를 붙여주면 아래와 같이 보입니다.

▼추가 : 한국 시간으로 변경하기

장고 프로젝트는 시간을 UTC 시간으로 표기합니다. 한국 시간대로 바꾸고 싶으면 settings.py에서 TIME_ZONE을 바꿔주면 됩니다.

# settings.py

TIME_ZONE = 'Asia/Seoul' # 기본적으로 'UTC'라고 되어있음.

한국 시간대로 변경한 모습

Comments