초보자를 위한 장고 뿌시기 4 관리자 페이지 만들기

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

  • 웹사이트 운영을 하다 보면 쌓이게 되는 많은 데이터
  • 이러한 많은 데이터들을 관리하기 위해 관리자 페이지가 필요!
  • CRUD, 데이터 검색 및 필터링….
  • 장고에서는 코드 몇 줄만 입력하면 쉽게 사용할 수 있는 관리자 페이지를 기본적으로 제공!

기본주소(도메인)/admin -> 관리자페이지 url로 접속 하게 되면 로그인 창이 뜬다! 접속하기 위해 super user를 만들어 주어야 한다.

python manage.py createsuperuser

를 터미널에 입력하고 ID, email, password를 설정하면 슈퍼유저가 생성된다.

이렇게 들어가게 되면 기본적으로 User, Group의 테이블이 존재한다. 이는 장고에서 기존에 만들어놓은 model들. 우리가 만들었던 post table을 관리자 페이지에서 관리 가능하게 하려면 post 폴더의 admin.py에서

from django.contrib import admin
from  .models import Post

admin.site.register(Post)
  • 현재 모듈(파일)에서는 Post 모델을 찾을 수 없기 때문에 import 필요
  • . : 같은 경로를 의미
  • -> .models : 같은 경로의 models에서
views

관리자 페이지 커스터마이징

  • 데코레이터를 통해 가능
from django.contrib import admin
from  .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'title',
        'content',
        'view_count',
        'created_at',
        'updated_at'
    )
    search_fields = (
        'title',
    )
  • list_display : tuple 형태로 관리자 페이지에서 보여주고 싶은 컬럼을 설정. 보통 콤마 단위로 줄바꿈해서 코딩
views
  • search_fields : tuple 형태로 검색 가능하도록 하는 컬럼을 설정. 반드시 마지막에 콤마를 써야 한다.
views
  • list_filter : Admin 사이트에 필터를 활성화할 항목을 설정하는 옵션

Date range filter 옵션 DateField를 list_filter 옵션에 추가하면 기본적으로 제공되는 필터링 옵션은 다음 4가지 항목 : Today, Past 7 days, This month, This year

그러나 현실에서는 날짜의 범위를 지정하여 필터링하는 경우가 더 많기 때문에, 기간 설정 필터링을 지원하는 패키지를 설치하여 사용하면 된다. django-admin-rangefilter와 같은 다양한 date range filter 패키지가 있다.

설치 방법은 command창의 pip를 이용하여 패키지를 설치한 후 INSTALLED_APPS에 추가하면 설치 완료.

$ pip install django-admin-rangefilter
#settings.py
INSTALLED_APPS = (
    ...
    'rangefilter',
    ...
)
from django.contrib import admin
from rangefilter.filter import DateRangeFilter, DateTimeRangeFilter
from  .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'title',
        'content',
        'view_count',
        'created_at',
        'updated_at'
    )
    list_filter = (
        ('created_at', DataRangeFilter),
    )
  • list_display_links : 목록 내에서 링크로 지정할 필드 목록 (이를 지정하지 않으면, 첫번째 필드에만 링크가 적용)
  • CRUD 가능
views
views

References

초보자를 위한 장고 뿌시기 3 Django로 모델링하기

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

처음으로 프로젝트를 생성하면 아래와 같은 파일 구조가 만들어진다. 프로젝트명은 MyFirstDjango로 설정하였다.

MyFirstDjango
|_ MyFirstDjango
  |_ __init__.py
  |_ settings.py
  |_ urls.py
  |_ wsgi.py
|_ manage.py
  • __init__.py : python ver 2대에서 패키지임을 알려주는 모듈
  • settings.py
    • 장고의 설정 파일. 중요!
    • 조금만 설정하면 어려운 기능도 쉽게 구현할 수 있게 해 준다.
    • INSTALLED_APPS : 어떤 앱들이 설치되어 있는지
    • DATABASE : 기본은 sqlite3 (보통 로컬 환경에서 작동하며, 실제 서비스 운영에는 부적합)
  • urls.py : application의 경로 설정
    • 기본적으로 관리자 페이지를 제공
urlpatterns = [
    path('admin/', admin.site.urls),
]
  • wsgi.py : web server gateway interface -> Nginx 등의 웹 서버와 장고 어플리케이션을 연결해주는 파이프라인 같은 것
  • manage.py : 다양한 명령어를 장고에서 실행할 수 있도록 해 준다.

실행을 누르면

python3 /workspace/MyFirstDjango/manage.py migrate && python3 /workspace/MyFirstDjango/manage.py runserver 0.0.0.0:80

의 명령어가 실행된다.

장고에서의 모델링

  1. models.py에서 모델링
  2. python manage.py makemigrations로 주문서를 만든다 : migration은 생성될 테이블 정보를 담은 주문서 cf) 테이블 : 모델의 설계를 그대로 데이터베이스에 저장한 형태
  3. python manage.py migrate로 주문서 내역대로 테이블 생성 (실제 데이터베이스에)
  4. 서버는 control+c로 종료

python manage.py startapp 앱이름 으로 앱을 생성

python manage.py startapp posts

cf) tab으로 자동완성 가능 하고 엔터를 누르면posts라는 폴더가 생성된다.

posts
|_ migrations
  |_ __init__.py
  |_ admin.py
  |_ apps.py
  |_ models.py
  |_ tests.py
  |_ views.py
|_ manage.py
  • admin.py : 관리자 페이지를 설정
  • tests.py : 테스트 진행
  • view.py : 요청을 받고 응답을 주는 곳

즉, MTV를 조작할 수 있는 부분이 생성된다!

한편 이 후에 INSTALLED_APPS에서 posts가 설치되었다는 것을 알려주어야 한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'posts',
]

그렇지 않으면 python manage.py migrate 명령어를 실행했을 때 No change detected 가 출력된다. 즉, 장고에서 posts app의 존재를 알 수 있도록 해 주어야.

posts에서 models.py에 모델을 생성해준다. model은 장고에서 class의 개념!

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    view_count = models.IntegerField(default=0)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  • auto_now_add : 자동으로 현재 시간이 입력됨
  • auto_now : 자동으로 생성 혹은 수정될 때의 현재 시간이 입력됨

INSTALLED_APPS에 추가하고, python manage.py makemigrations 명령어를 실행하면

Migrations for 'posts':
  posts/migrations/0001_initial.py
    - Create model Post

-> posts를 위한 주문서가 ‘0001_initial.py’로 생성되었다!

해당 파일에 들어가 보면

# Generated by Django 2.2.4 on 2020-01-13 05:40

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Post',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=200)),
                ('content', models.TextField()),
                ('view_count', models.IntegerField(default=0)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
        ),
    ]
  • id : autofield (자동으로 생성되는 필드), 기본키

그리고 python manage.py migrate 명령어를 터미널에 실행시키면 DB에 테이블 형태로 Post가 생성된다! 해당 테이블은 python shell에서 확인할 수 있다. 터미널에 python manage.py shell을 입력하면 shell을 이용할 수 있다.

먼저 import를 해 줘야 한다.

In [1]: from posts.models import Post
In [2]: Post.objects.create(title="간장게장 담그는 법", content="알이 꽉 찬 꽃게를 간장에 담근다.")
Out[2]: <Post: Post object (1)>
  • new object 생성
In [3]: Post.objects.all()
Out[3]: <QuerySet [<Post: Post object (1)>]>
  • Post.objects.all() == Select * From Post
In [4]: post = Post.objects.get(id=1)

In [5]: post.title
Out[5]: '간장게장 담그는 법'

In [6]: post.content
Out[6]: '알이 꽉 찬 꽃게를 간장에 담근다.'

In [7]: post.view_count
Out[7]: 0

In [8]: post.created_at
Out[8]: datetime.datetime(2020, 1, 13, 5, 48, 3, 723162, tzinfo=<UTC>)

위와 같이 모든 attribute를 확인할 수 있다!

초보자를 위한 장고 뿌시기 2 MTV 패턴

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

MTV 패턴

  • 일반적으로 MVC 패턴이라고 부르는 것과 의미 자체는 같음
  • view -> template
  • controller -> view

  • 모델(Model) : 데이터베이스에 저장되는 데이터를 가지고 오거나 저장, 수정
  • 템플릿(Template) : 사용자에게 보여지는 부분
  • 뷰(View) : 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 가공하여 그 결과를 템플릿에 전달하는 역할 / 모델과 템플릿 사이에서 중계자 역할

  • 클라이언트 : 행위의 주체
  • 뷰 : 요청에 대한 응답을 하는 곳 / 서버같은 역할
  • 뷰는 어떤 주방같은 곳
  • 클라이언트는 뷰에게 요청(request)
  • 뷰는 클라이언트에게 응답(response)
  • url 접속 -> 11번가 서버로 request -> 11번가 홈페이지 보임 -> 11번가 서버의 response(html로 이루어진 화면)
  • 즉, 요청을 보내고 응답을 받는 구조
  • 템플릿 : 뷰에서 response로 쓰이는 html 등등
  • view는 render를 통해 template을 response로 클라이언트에게 보여줌
  • 모델 <- 정말 중요
  • 모델은 추상적 개념
  • 파이썬에서의 클래스
  • 붕어빵을 찍어내는 것과 같은 modeling을 통해 만들어짐
  • database를 만들기 위한 설계
  • Database : 실제로 데이터를 저장하는 곳
  • 11번가의 여러 상품들 - 상품이름, 가격, 이미지 등
  • product에는 이름, 가격, 이미지가 있다는 설계
  • 그 설계를 통해 만들어진 것 -> 모델
  • 객체 : 상품 모델 (설계) 를 통해 찍어낸 상품 하나하나
  • 데이터베이스에서는 SQL 사용
  • 파이썬과 SQL은 다른 언어이므로 통역사가 필요 -> ORM
  • ORM : Object Relational Mapping
  • 모델링 과정을 통해 모델을 만들고 이를 통해 찍어낸 각 객체들을 데이터베이스에 실질적으로 저장
  • 이들을 서버의 데이터베이스에서 불러와서 화면에 띄워준다!

  • 웹서비스를 하나 만든다고 가정
  • 먼저 모델링부터
  • User라는 모델을 만든다
  • -> Username, Email, Password, Bdate의 컬럼(필드, 애트리뷰트)
  • 하나의 객체를 생성한다
  • -> 성원, tjddnjss@domain.com, 1111, 910101
  • 모델링한 유저 모델을 실제 데이터베이스에도 저장해야 함
  • migration이라는 주문서를 만들고 이 주문서를 migrate라는 과정을 통해 데이터베이스에 User Table 생성
  • column = 속성
  • 모델은 붕어빵 틀처럼 객체들을 찍어내기 위해 만드는 것
  • Post (Title, Content)
  • 쇼핑몰을 만든다고 가정
  • User(Username, Email, Password, Bdate, CreatedAt, UpdatedAt)
  • Product(Name, Price, CreatedAt, UpdatedAt)
  • 이렇게 설계한 것들이 모델이고 모델을 통해 객체를 찍어낸다
  • Review(Content, CreatedAt, UpdatedAt)
  • 이 정보들을 실질적으로 데이터베이스에 저장하고
  • 그 데이터베이스에서 정보를 불러와서 사용자 화면에 띄워줌

  • CreatedAt, UpdatedAt : 객체가 언제 생성되고 언제 수정됐는지에 대한 정보는 중요함 -> 꼭 가지고 있어야 함

  • 모델링의 각각의 컬럼이 어떤 데이터 타입을 가지고 있는지 중요

  • Username : String

  • Email : String

  • Bdate : date


  • Relation : 상호간의 관계

  • 리뷰 <- 어떤 사용자가 어떤 상품에 대해 썼는지 <- 외래키를 통해 가져옴

  • 관계까지 설정하는 것이 모델링


  • 장고에서 모델링을 할 수 있다!


처리과정

  • 클라이언트의 요청(request)

  • url conf 모듈을 이용하여 url을 분석

  • 해당 url에 대한 처리를 담당하는 view 결정

  • view는 로직을 실행하면서 데이터베이스 처리가 필요한 것은 모델을 통해 처리하고 결과를 반환하여 템플릿을 활용해 클라이언트에 전송할 html 파일 생성

  • view는 최종결과로서 html 파일을 클라이언트에게 응답(response)

  • 11번가 링크 누름 -> 11번가 서버로 request를 보냄 -> 모델을 거쳐 데이터베이스로부터 ORM을 통해 상품 오브젝트들을 가져와서 템플릿에 데이터들을 뿌려준 뒤 응답으로 이 화면을 사용자에게 띄워준다.

References

초보자를 위한 장고 뿌시기 1 Django란?

|

goormedu의 초보자를 위한 장고 뿌시기를 보고 공부한 것을 정리합니다.

  • 언어 : 소통하기 위한 수단
  • 프로그래밍 언어 : 컴퓨터와 소통하기 위한 수단
  • 파이썬 -> 컴퓨터와 대화하는 하나의 방식
  • 라이브러리 : 활용 가능한 도구들의 집합
  • 프레임워크 : 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합
  • 라이브러리가 됐든 프레임워크가 됐든 앞으로 파이썬으로 이루어진 것들을 사용할 것 (장고니까)
  • 웹 프레임워크로서의 장고
    • 사용자 인터페이스
    • 데이터베이스 연동 (Oracle, Mysql, Postgresql…)
    • URL 파싱
    • 세션 관리
    • 관리자 페이지
    • Request 파싱
    • 등등
  • MTV
    • Model
    • Template
    • View
  • 장고가 제공하는 것
    • 개발 프로세스
    • 관리자
    • 보안
    • 등등

2020년 상반기 회고

|

를 9월 10일 오후 11:57분에 쓴다. 다 쓰면 9월 11일이 되어 있을 것이다.

지키지 못한 계획

2020년 6월 1일의 나는 스케줄러에 다음과 같은 계획을 적어 넣었다.

  • 5월 회고 깃허브 블로그에 올리기

쓰려고 했던 시도가 없었던 것은 아니나, 결국 쓰지 못했고 올라가지 않았다. 그 뒤로 많은 계획들이 비슷한 길을 걸었다.

5월

드디어 취직을 했다. SM 부서에 배정되었다. SM 부서에서 무슨 일을 하는지에 대해 몰랐던 것은 아니나, 그 당시의 나는 무슨 일이든 일단 해 보고 싶었다. 실제로 어떤 방식으로 업무가 진행되는지 궁금했다.

무슨 일을 했나?

Java 백엔드, 거기에 더해 SAP 유지보수 및 신규 프로그램 개발 가끔 데이터 추출 주로, 단순 문의 혹은 에러 문의의 원인 파악 및 해결 및 그에 따른 전화 혹은 답신

그래서 계획은 왜 못 지켰나?

해이해졌다. 회사를 다니기 시작하면서 체력이 떨어진 것도 사실이나 시간은 만들려면 얼마든지 있었다. 통장에 찍히는 월급 앞에 가장 큰 목표가 흐릿해졌다.

갑자기 왜 이제와서 회고를 쓰나?

시간은 돌릴 수 없기에 앞으로 나아가기 위해.

오늘 강의를 들으면서 내가 그동안 공부했던 것들이 어디 가지 않았구나 하는 생각을 했다. 동시에 짧은 시간이었지만 녹슬었구나, 라고도 생각했다. 나는 공부를 할 때 의미있다고 느끼는구나, 나의 효용감을 느끼는구나.

배우는 것이 좋다. 정체되어 있는 것은 싫다. 게임할 때도 이 시간에 내가 공부하고 있었다면 이라고 자꾸 생각하게 된다.

이제부터는 간단하다. 하고 싶으면 하면 된다.

구체적으로 뭐가 하고 싶고, 무엇을 해야 하나?

하고 싶은 것: 주니어개발자로서 성장하기 되고 싶은 나: 어떤 일을 하더라도 (개발과 무관하더라도) 항상 더 공부하는 사람. 자만하거나 정체되어 있지 않은 사람 그러기 위해서 해야 하는 것

  1. 지금 하고 있는 공부 마무리 (시작해놓은 것은 끝내 놓자)
    • 인프런 함수형 자바스크립트 강의
    • 리액트 책
    • 리액트 인프런 강의
  2. 코딩테스트 준비 3. 추가 공부
    • 모던 JS
    • CSS-네이버 부트클래스
    • HTML
    • 브라우저, 웹 4. 작은 프로젝트라도, 제대로 시작해서 끝을 보기

계획을 구체화하면서 오랜만에 timetable을 짰다.

꼭 해야 하는 것: YIL 쓰기

왜 TIL이 아니라 YIL을 쓰는가

  • 11:30분 이전에는 반드시 취침하기로 했다. 그러려면 공부를 다 하고 난 뒤 TIL을 쓸 시간이 빠듯하다.
  • 차라리 자고 일어나서 아침에 복기하면서 YIL을 쓰는 것이 공부 효율 면에서도 좋을 것이라 생각했다.
  • 일단 당장 내일부터 해 보고, 차후 수정될 수 있다.
  • YIL은 기존 TIL 폴더에 작성한다.