MTV 패턴
Model 모델로 자료의 형태를 정의하고
View 어떤 자료를 어떤 동작으로 보여줄지
Template 템플릿으로 웹페이지에서 출력할 모습을 정의
깃세팅 - 가상환경세팅 - 가상환경실행 - pip install django 장고설치
django-admin startproject do_it_django_prj . 폴더에 장고 프로젝트 만들기.
python manage.py migrations 데이터베이스 생성하기
python manage.py createsuperuser 관리자 계정 생성하기
python manage.py runserver 서버 실행하기
http://127.0.0.1:8000 접속 확인.
http://127.0.0.1:8000/admin 접속 확인.
생성된 파일중 urls.py는 어떤 url로 접속했을때 어떻게 작동시킬지 정리해놓은 파일, settings.py는 프로젝트의 설정을 담고있는 파일
SQLite 파일하나로 관리하는 데이터 베이스
복잡한 설치과정이 없으나 읽고 쓰기가 빈번하게일어나는 대형 프로젝트에서는 불리하다. 충돌이나 오류를 유념하여 깃으로 관리하지않는다.
python manage.py startapp blog 블로그 만들기
python manage.py single_pages 싱글 페이지 생성
각 폴더에는 admin.py,app.py, models.py, tests.py, views.py 가 생성되어있다. 각 독립된 파일들로 독립된 기능을 한다.
블로그모델 만들기: models.py에 post class 만들기 - settings.py의 installed_apps에 추가하기 - 마이그레이션
python manage.py makemigrations - python manage.py migrate 실제 데이터베이스에 적용
# blog/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
INSTALLED_APPS = [
# ...
'blog',
]
admin.py에 post 모델 등록하기 - 접속해 테스트 http://127.0.0.1:8000/admin
*시간이 맞지않다면 settings.py에 TIME_ZONE 의 UTC를 Asia/Seoul로 변경, USE_TZ를 False로 설정
# blog/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
blog 폴더의 url.py에 urlpatterns를 정의하고, views.py에서 해당 render를 return. - root의 urls.py에 urlpatteren을 정의한다. - http://127.0.0.1:8000/blog/ 확인.
# blog/urls.py
from django.urls import path
from .views import post_list
urlpatterns = [
path('', post_list, name='post_list'),
]
# blog/views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'blog/post_list.html', {'posts': posts})
<!-- blog/templates/blog/post_list.html -->
<h1>블로그</h1>
{% for post in posts %}
<article>
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<small>{{ post.created_at }}</small>
</article>
{% empty %}
<p>작성된 글이 없습니다.</p>
{% endfor %}
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
FBV (Function-Based View) 함수로 뷰 작성, 내가 직접 로직을 함수로 작성하는 방식
CBV (Class-Based View) 클래스로 뷰 작성, Django가 만들어둔 클래스/기능을 상속해서 재사용하는 방식
이때 클래스는 url에서 바로 호출하지않음으로 .as_view()를 통해 Django가 처리할 수있는 뷰 함수로변환해야한다.
블로그에서는 CBV가 확실히편하다. Django가 기본적으로 제공하는 제네릭 CBV가 있기 때문에 CRUD를 상당히 짧게만들 수있다.
# views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts})
# views.py
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'blog/post_list.html'
context_object_name = 'posts'
from django.urls import path
from .views import PostListView
urlpatterns = [
path('', PostListView.as_view(), name='post_list'),
]
| 글 목록 | ListView |
| 글 상세 | DetailView |
| 글 작성 | CreateView |
| 글 수정 | UpdateView |
| 글 삭제 | DeleteView |
장고는 이미지 업로드를 위한 ImageField를 제공한다
ImageField의 이미지 검사를 위해 Pillow 라이브러리 사용 pip install Pillow - python manage.py makemigrations - python manage.py migrate
settings.py에 image path 지정 - models.py에 images 필드 추가
urls.py에 미디어 파일을 위한 url 지정하기
html에서 보여주기
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
image = models.ImageField(upload_to='blog/', blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ...
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
<img src="{{ post.image.url }}" alt="{{ post.title }}">
파일업로드 FileField
models.py 에 filefield 객체 추가 - python manage.py makemigrations - python manage.py migrate
관리자페이지에서 파일업로드 기능 확인하기
+post.file.url, post.file.name로 정보가져올수있다.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
file = models.FileField(upload_to='files/', blank=True, null=True)
if문 {%if 조건%} ~{%else 조건 %} {%elif 조건 %}{%end if%}
https://standout.tistory.com/1701
혼자 공부하는 파이썬 - Chapter 03 조건문
03-1 불 자료형과 if 조건문 Boolean, 불린, 불리언 True와 False값만 가질 수 있으며 비교연산자를 통해 만들 수 있다.불끼리는 논리연산자를 사용할 수 있다. https://standout.tistory.com/1147 자바의 정석 Chap
standout.tistory.com
truncatewords:숫자, 글자 자르기
models.py에 CharField 정의하기 max_length 는 DB에 저장할 수 있는 최대 길이를 정하는 것
python manage.py migrations - python manage.py migrate
class Post(models.Model):
title = models.CharField(max_length=200)
<h2>{{ post.title }}</h2>
<p>{{ post.content|truncatewords:20 }}</p>
<a href="{% url 'post_detail' post.pk %}">
자세히 보기
</a>'Personal > Book' 카테고리의 다른 글
| 파이썬 텍스트 마이닝 완벽 가이드 1부 텍스트 마이닝 기초 (0) | 2026.08.09 |
|---|---|
| Do it! 장고+부트스트랩 파이썬 웹 개발의 정석 - 첫째마당 웹 개발 기초 다지기 (0) | 2026.08.09 |
| 파이토치 딥러닝 마스터 - 2부 - 9장 암과 싸워 이기기 위한 파이토치 활용 (0) | 2026.08.09 |
| 파이토치 딥러닝 마스터 - 1부 - 8장 컨볼루션을 활용한 일반화 (0) | 2026.07.14 |
| 파이토치 딥러닝 마스터 - 1부 - 7장 새와 비행기 구별하기: 이미지 학습 (0) | 2026.07.14 |