[Django] CRUD PJT 실습 2

gonzo·2020년 9월 27일
0

Django

목록 보기
3/3
post-thumbnail

지난 이야기
가상환경 설정, 패키지 설치, 프로젝트 및 앱 생성(settings.py에 등록하는 과정 포함)
본인이 설정한 프로젝트 / 앱 이름 = crudproject / posts

앞서 말했지만 프로젝트 = 앱의 집합체이므로 앱 별로 url을 따로 설정하는 과정이 있으면 편리하다(전체 프로젝트 내에서 총괄적으로 관리도 가능하지만 점검의 용이성 등을 위해 앱 별로 url을 따로 만들어서 관리하는 것을 말함).

🔴 urls.py - url 분리하기

# 프로젝트 폴더 내의 urls.py에서 작업한다

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

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

Django - url 공식 문서

위 코드에서 path('posts/', include('posts.urls'))를 추가했다. 만든 앱 내에서 따로 url을 지정하겠다는 의미로 전체 프로젝트 urls.py에서는 해당 앱의 urls.py를 불러와서 사용하겠다는 뜻이당.

# 앱 내의 urls.py에서 작업한다(초기 앱 폴더 내에는 urls.py가 없으므로 만들어 주어야 함)
from django.urls import path, include
from . import views

app_name = 'posts'

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

🟠 models.py 설정

MTV

class Post(models.Model):
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.title

CharField, TextField 등은 전에 글 쓴 적이 있으니 여기서는 크게 다루지 않겠지만 요약하면 CharField는 글자 수가 제한이 있을 때, TextField는 글자 수의 제한이 없을 때.
auto_now_add = True를 통해 생성 일자의 표시(최초 생성)가 가능하고, auto_now = True를 통해 수정 일자의 표시(최종 수정)가 가능하다.
그리고 class Post(models.Model)처럼 class의 이름은 단수형이 좋다!

def __str__(self):
        return self.title

🟡 views.py 설정

MTV

from .models import Post : .models.py에서 Post 모델을 쓸 것이므로 갖고 와야 한다
posts = Post.objects.all() posts = 모든 Post 객체를 갖고 온다

context = {
        'posts' : posts,
    }

context는 템플릿에서 쓰이는 변수명과 Python 객체를 연결하는 사전형 값이다. Django에서는 템플릿에 이러한 context를 채운 결과를 render를 통해 HttpResponse로 반환하는 구문을 주로 쓴다.

render() 함수는 request 객체를 첫번째 인수로 받고, 템플릿 이름을 두번째 인수로 받으며, context 사전형 객체를 세전째 선택적(optional) 인수로 받습니다. 인수로 지정된 context로 표현된 템플릿의 HttpResponse 객체가 반환됩니다.
~ Django Docs ~

🟢 templates 설정

MTV
templates는 views.py에서 정의한 함수들이 어떻게 웹 페이지 상에서 구현되는지를 보여주는 기능을 한다(고 나는 정의하기로 함). 여러 페이지를 하나하나 만들 수도 있지만 Django에서는 extends라는 멋진 기능을 주로 활용하여 전체 프레임(주로 겹치는 부분-NavBar, Footer 등)을 만든 후 각 페이지의 성격에 맞는 본문 내용을 따로 작업하는 방식을 애용한다.
base.html이라는 기초 페이지를 만든 후 이 페이지를 각각의 페이지에서 extends 해 와서 사용하면 된다(나는 Bootstrap 홈페이지에서 제공하는 CDN을 가져다 썼다).

그리고 만들어진 이 기초 페이지를 바로 사용할 수 있는 것은 아니고 추가 작업이 또 필요한데 이 작업은 settings.py에서 이루어진다.

위 사진에서 밑줄 친 부분을 수정하면 된다. 우리가 만든 프로젝트와 동일한 계층의 폴더(manage.py와 같은 계층)에 templates 폴더를 생성한 뒤에 그 폴더 내에 base.html 파일을 만들어서 쓰는 것이므로 BASE_DIR/'templates'로 작성하는 것!

+---crudproject
|   |   db.sqlite3
|   |   manage.py
|   |   
|   +---posts
|   |   |   admin.py
|   |   |   apps.py
|   |   |   models.py
|   |   |   tests.py
|   |   |   urls.py
|   |   |   views.py
|   |   |   __init__.py
|   |   |   
|   |   |           
|   |   +---templates
|   |   |   \---crudapp
|   |   |           index.html
|   |           
|   +---crudproject
|   |   |   asgi.py
|   |   |   settings.py
|   |   |   urls.py
|   |   |   wsgi.py
|   |   |   __init__.py
|   |   |   
|   |           
|   \---templates
|           base.html
|           
\---venv

그러면 지정한 url을 입력했을 때 위 사진처럼 올바른 페이지가 뜨게 될 것이다❕

profile
💬직업은 IT로 하겠습니다 근데 이제 건축을 곁들인...

0개의 댓글