본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Personal/Book

Do it! 장고+부트스트랩 파이썬 웹 개발의 정석 - 둘째마당 블로그 웹 사이트 만들기

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>