[5주차]django - 20220104

김동영·2022년 1월 4일
0

django

  • 대규모 프로젝트에 적합
  • 내장되어 있는 기능이 많음(기본적인 덩치가 큼)

vs flask

  • Micro 웹 프레임워크
  • 소규모 프로젝트에 적합

설치

pip install django

pip freeze

실행

django-admin startproject <project name>

지정한 이름의 폴더가 생기고, 내부에 manage.py가 생긴다.

python manage.py runserver 명령어로 실행한다.

서버 실행 후 생기는 주소에 접속하면 다음과 같은 화면이 확인된다.

프로젝트 구조

settings.py : 각종 django 프로젝트 설정
urls.py : url 관리
manage.py : 서버 실행 역할
db.sqlite3 : 데이터베이스

django는 하나의 프로젝트에 여러가지의 app으로 구성되어있으며,
각종 요청에 따라 app을 호출한다.

App 만들기

  • 해당 명령어 실행 위치는 django 프로젝트 루트여야 한다.

예를 들어 project name이 webproj일 때,

~/webproj/ 에서 실행한다.

django-admin startapp homepage

admin.py : admin page 관리
apps.py : app에 대한 설정 관리
models.py : 데이터 베이스에 대한 schema
test.py : app에 대한 테스트 관리
views.py : app의 view 관리

MVT Pattern

  • MVC : model, view, controller
  • MVT : model, view, template -> 동적 웹페이지가 가능

# view.py

def index(request):
    return HttpResponse("Hello World!")

#url.py

from homepage.views import index
urlpatterns = [
    path('admin/', admin.site.urls), # # 127.0.0.1/admin/
    path('', index) # 127.0.0.1/
]

# settings.py

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

간단한 app 하나를 추가하기 위해서 3개의 파일을 수정해야 한다.

app 은 view.py에,
url.py에 어떤 url에 대해서 해당 app을 호출할 것인지,
settings.py에 어떤 app을 가지고 있는지 명시해야 한다.

DB 연동 및 기본 admin page 구성

python manage.py migrate

python manage.py createsuperuser
  • adming 계정 생성

  • admin 기본 홈페이지

  • 로그인 화면

Template 구성하기

  • render(request, '.html', {})
    html파일을 render 함수를 통해 관리할 수 있다.

dict 형태로 전달받은 인자를 html에서 {{ argKey }} 형태로 사용할 수 있다.

view.py

from django.shortcuts import HttpResponse, render

# Create your views here.
def index(request):
    # return HttpResponse("<h1>Hello World!</h1>")
    name = "gildong"
    return render(request, 'index.html', {'my_name': name})

# index.html
# 기본적인 구성

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Python django example</title>
    </head>
    <body>
        <h1>Title</h1>
        <p>test html</p>
        {{ my_name}}
    </body>
</html>

# setting.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
        os.path.join(BASE_DIR, "homepage", "template")
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

'DIRS' 부분에 html 파일의 위치를 명시한다.

  • 결과

html의 간단한 함수 사용

| (파이프라인)을 이용해서 다음과 같은 방식으로 사용한다.
{{ my_name |length }}

{{ my_name |upper }}

  • for 문 적용
# view.py

from django.shortcuts import HttpResponse, render

# Create your views here.
def index(request):
    # return HttpResponse("<h1>Hello World!</h1>")
    num = [10, 20, 30, 40, 50]
    return render(request, 'index.html', {'my_list': num})

# index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Python django example</title>
    </head>
    <body>
        <h1>Title</h1>
        <p>test html</p>
        {% for element in my_list %}
            {{element}}
        {% endfor %}
    </body>
</html>

  • if 문 적용
# index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Python django example</title>
    </head>
    <body>
        <h1>Title</h1>
        <p>test html</p>
        {% for element in my_list %}
            {% if not element|divisibleby:"20" %}
                {{element}}
            {% endif %}
        {% endfor %}
    </body>
</html>

mission

  • 자기소개 페이지 만들기
# views.py

def introduce(request):
    name = "김동영"
    birth = "19940314"
    content = ["프로그래머스 인공지능 데브코스 3기", "예비집사", "고양이 카페 우수 회원"]
    return render(request, 'introduce.html', {'my_name': name, 'my_birth': birth, 'my_content': content})

# introduce.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>자기소개</title>
    </head>
    <body>
        <h3>이름 : {{my_name}}</h3>
        <h3>생년월일 : {{my_birth}}</h3>
        <h3>소개 : </h3>
        {% for content in my_content %}
            {{content }} <br>
        {% endfor %}
    </body>
</html>

문자열에 \n을 넣어서 표현하려고 했는데 html 문법에는 적용되지 않아서, 문자열 리스트를 전달한 후 for 문을 통해 content 마다 <br>을 사용하여 줄바꿈을 적용하였다.

profile
오래 공부하는 사람

0개의 댓글