[Django] 장고에 앱과 웹페이지 만들기
** 2022년 5월 10일에 작성한 글입니다. **
🎈앱 개발하기
cmder에 입력하는 코드는 가상환경을 실행시킨 후 작성하는 코드임을 전제합니다.
1. 앱 만들기
cmder에 python manage.py startaapp 앱이름을 입력한다. 나는 blog앱과 single_page앱을 넣어주었다. 그러면 아래의 사진과 같이 앱들의 폴더가 생성된 것을 볼 수 있다.
2. 모델 만들기
(1) 모델 만들기
앱 폴더의 models.py 파일에 모델을 만든다. 만약 블로그에 올릴 포스트의 현태를 정의하는 post 모델을 만들 것이라면 아래와 같이 코드를 입력한다. CharField와 DateTimeField를 이용하여 필드를 만들 수 있다.
class Post(models.Medel):
title=models.CharField()
created_at=models.DateTimeField()
(2) 앱 등록하기
프로젝트 폴더 -> settings.py 파일 -> INSTALLED_APPS[ ]리스트에 새로 만든 앱을 등록한다.
(3) 데이터베이스에 모델 반영하기
데이터베이스에 반영할 수 있게 마이그레이션을 해준다. cmder에 python manage.py makemigrations와 python manage.py migrate를 입력한다.
(4) .gitignore 수정하기
migrations/를 추가한다.
✨웹 페이지 만들기
1. URL 설정하기
(1) 앱 폴더에 urls.py 파일 만들기
(2) 메인 페이지에 앱 url 추가하기
메인 프로젝트의 urls.py에 아래의 코드처럼 url을 추가한다.
from django.urls import path, include
urlpatterns = [
path('blog/',inlcude('blog.urls')),
path('admin/',admin.site.urls),
]
2-1. FBV로 페이지 만들기
FBV : 함수에 기반을 둔 방법, 사용자가 직접 함수를 만들어서 원하는 기능을 직접 구현
(1) 앱의 urls.py에 내용 추가하기
from . import views #현재 폴더( . )에서 views.py를 이용
urlpatterns = [
path('',views.index), #URL이 '앱이름/'으로 끝나면 views.py에 정의되어 있는 index()함수를 실행
#index()함수는 사용자 정의 함수로 함수명이 index가 아니어도 상관X
]
(2) 앱의 views.py에 함수 정의하기
def index(request):
return render(
request,
'앱이름/index.html',
)
- request 인자 : 어떠한 요청을 처리하기 위해 사용된다. render 함수를 통해 '앱이름/index.html'을 리턴
- render 함수
- 기본 구조 : render ( request , '불러오고 싶은 파일 명')
- 앱 폴더> templates 폴더 > 앱 폴더 > .html을 활용해 responses를 생성하는 함수
ex) blog/templates/blog/index.html
(3) 포스트 목록 나열하기
a. 앱의 views.py에 posts 정의하기
from .models import Post # models.py에 정의 되어 있는 Post 모델을 임포트
def index(request):
posts=Post.objects.all()
return render(
request,
'앱이름/index.html',
{
'posts'=post # posts를 딕셔너리 형태로 저장
}
)
- Post.objects.all() : 데이터베이스에 쿼리를 날려 원하는 레코드를 가져와 저장`
b. index.html 수정하기
<body>
{% for p in posts %}
<h3>{{ p }}</h3>
{% endfor %}
</body>
- for문 : {% for 인자 in 딕셔너리 %} ... {% endfor %}
2-2. CBV로 페이지 만들기
CBV : 장고가 제공하는 클래스를 활용하여 구현
FBV 작성해 둔 코드는 주석처리 되었다는 가정하에 코드를 작성했습니다.
(1) 앱의 urls.py에 내용 추가하기
urlpatterns = [
path('', views.PostList.as_view()),
]
(2) 앱의 views.py에 ListView로 포스트 목록 페이지 만들기
from django.views.generic import ListView
class PostList(ListView):
model = Post
(3) 앱의 index.py에 list 사용하기
<body>
{% for p in post_list %}
<h3>{{ p }}</h3>
{% endfor %}
</body>
index.py 파일명을 post_list.py로 수정한다. 템플릿명을 명시하지 않으면 post_list가 post-list.py를 인식하지 못하기 때문이다.