장고개발 가상환경 활성화
source djangotest/bin/activate
출처: https://joycecoder.tistory.com/84 [SongLee, 개발, IT, 맛집, 여행, Etc..]
파이썬 라이브러리 : pypi.org
python --version
- pip install 라이브러리명
예) pip install django
- pip unistall 라이브러리명
- pip show 라이브러리명
예) pip show pandas
pip show django
- pip list
-장고 버전 확인법
django -admin --version
pip show django
pip show django
Django MTV 퍠턴
MTV(Model Template View) 패턴
1) Model : 테이블을 정의한다
2) Template : 사용자가 보게 될 화면의 모습을 정의한다.
3) View : 애플리케이션의 제어 흐름 및 처리 로직을 정의한다.
모델은 model.py 파일에, 템플릿은 tempaltes 디렉토리의 하위의 *.html 파일에,
뷰는 views.py 파일에 작성하도록 처음부터 뼈대를 만들어 준다.
startproject 및 startapp 명령을 실행하면 자동으로 뼈대를 만들어준다.
- 프로젝트 안에 앱을 여러개 만들수 있다.
예) django-admin startproject mysite ===> 이런식으로 하면 mysite 아래 다시 mysite 가 생긴다. 그래서 마지막에 '.' 을 추가하는 방식을권장한다. 단, 프로젝트 디렉토리를 이미 만들어서 그안에서 프로젝트를 만들때만.....
예) django-admin startproject mydjango .
생성된 파일
manage.py : 웹사이트 관리를 도와주는 역할을 하는 파일
settings.py :웹사이트 설정이 있는 파일
urls.py : urlresolver가 사용하는 요청 패턴(URL 규칙) 목록을 포함하고 있는 파일
wsgi.py : Web Server Gateway Interface 이며 Python의 표준 Gateway Interface 입니다.
asgi.py : Asynchronous Server Gateway Interface. WSGI 와 비슷한 구조를 가지며, 비동기 통신을 지원한다.
# settings.py 수정
import os
LANGUAGE_CODE = 'ko' ==> 한글로 출력되도록 변경
TIME_ZONE = 'Asia/Seoul'
STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL)
# 데이터베이스 생성 (파일 db 생성됨)
python manage.py migrate (admin, auth, contenttypes, sessions 테이블 생성)
db.sqlite3 파일이 생성됨
settings.py 의 DATABASE 항목을 보면...아럐와 같은것을 확인할 수 있다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3', => 전체경로
}
}
# 웹서버 실행
1. python3 manage.py runserver 0.0.0.0:8000
2. python manage.py runserver
# Superuser 계정 생성
python manage.py createsuperuser (계정 생성, user 테이블에 계정이 생성됨)
python manage.py runserver (웹서버 구동)
localhost:8080/admin (접속)
# 앱 만들기 순서
1. 모델을 제일 먼저 만든다.(모델 클래스를 먼저 만들고, DB에 테이블은 명령어를 통해서 진행)
2. View 만든다.
3. URL 라우팅 만든다.
4. 화면 만든다.
#Django Model
1. ORM(Object Relational Mapping) 을 이용한다.
2. 파이썬 클래스와 데이터베이스 테이블을 맵핑한다.
- Model : DB 테이블과 매핑
- Model Instance : DB 테이블의 1 Row
#DJango Model FieldType 아래 URL에서 지원하는 모델타입들을 확인할 수 있다.
https://brunch.co.kr/@ddangdol/4
# Relation타입은 아래 글을 참고 해라. (검색해봐라)
[Django] 관계를 표현하는 모델 필드, ForeignKey,OneToOneField,ManyToManyField
사용자 ssung.k 2019. 7. 20. 16:16
model 을 설계하는데 있어서 관계는 뺴놓을 수 없는 중요한 개념입니다. 각 모델 간에 여러 관계를 정의함으로서 많은 걸을 구현 할 수 있게 됩니다. 관계는 총 3가지가 있으며 이번에는 바로 그 관계에 대해서 알아보도록 하겠습니다.
# 앱디렉토리 만들기
python manage.py startapp blog
# 앱이름추가
settings.py 에 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
#blog앱 (Post) Model 만들기..아래 속성들을 models.py 에 작성하면 됨.
title
text
author
created_date
published_date
=====================================models.py ====================================
from django.db import models
from django.utils import timezone
# Create your models here.
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
#비어있는것도 허용, null 도 허용하겠다.
published_date = models.DateTimeField(blank=True, null=True)
def published(self):
self.published_date = timezone.now()
#table에 저장
self.save()
def __str__(self):
return self.title
==========================================================================
# DB에 테이블 만들기
1) 마이그레이션 파일 생성하기(파이썬 파일로, 일종의 테이블 생성 스크립트 비슷한 파일이다)
python manage.py makemigrations blog
실행결과
Migrations for 'blog':
blog/mirations/0001_initial.py ==> 이 파일이 생성됨
- Create model Post
---------------------------------------------------------------------------------------------------------------------------------------------------------
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200)),
('text', models.TextField()),
('created_date', models.DateTimeField(default=django.utils.timezone.now)),
('published_date', models.DateTimeField(blank=True, null=True)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
---------------------------------------------------------------------------------------------------------------------------------------------------------
2) 실제 데이터베이스에 Model 추가를 반영하기
python manage.py migrate blog
python manage.py runserver
****중요....관리자 페이지에서 만든 모델을 보기 위해서는 Post 모델을 등록하는 절차가 필요하다.
아래 내용을 입력하고, admin 페이지를 refresh 하라
-------------------------------------------------------admin.py-----------------------------------------------------------------------------------
from django.contrib import admin
# Register your models here.
from django.contrib import admin
from .models import Post
admin.site.register(Post)
---------------------------------------------------------------------------------------------------------------------------------------------------------
# 마이그레이션 적용현황
python manage.py showmigrations blog
# 지정 마이그레이션의 SQL 내역
python manage.py sqlmigrate <app-name> <migration-name>
# 마이그레이션 파일은 일종의 작업 지시서...db생성 스크립트 같은것이다.
python manage.py migrate <app-name>
---> 미적용 <마이그레이션 파일> 부터 <최근 마이그레이션 파일> 까지 "Forward 마이그레이션"이 순차적으로 수행된다.
python manage.py migrate <app-name> <마이그레이션 파일명>
---> <지정된 마이그레이션 파일> 이 <현재 적용된 마이그레이션> 보다 이후이면, "Forward 마이그레이션" 이 순차적으로 수행
---> 이전이면 "Backward 마이그레이션" 이 순찾적으로 수행 (롤백)
# 적용된 실제 sql 구문을 확인하려면...
python manage.py sqlmigrate <app-name> <숫자(마이그레이션파일>
# 필수 입력 필드를 추가
- 기존 모델 클래스에 필수 필드를 추가하여 makemigrations 수행
- 필수 입력 필드를 추가하므로, 기존 Row들에 필드를 추가할 때, 어떤 값으로 채워 넣을 지 묻는다.
선택1) 지금 값을 입력
선택2) 모델 클래스를 수정하여 디폴트 값을 제공
#Django URLConf(configuration)란?
1) 프로젝트/settings.py 에 최상위 URLConf 모듈을 지정
- URLConf는 장고에서 URL과 일치하는 view 를 찾기 위한 패턴들의 집합이다.
- 특정 URL 과 View 맵핑 List
- Django 서버로 Http 요청이 들어올 때마다, URLConf 매핑 List를 처음부터 끝까지 순차적으로 찾으며 검색
사용법)
1. 각 app 마다 urls.py 파일을 만든다.
예) blog.urls.py 파일에
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
2. 프로젝트의 urls.py 파일에서 각 app 의 urls.py 파일을 보도록 한다.
예) 프로젝트안의 urls.py 파일에 아래 추가
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
# View
- View 는 애플리케이션의 "로직"을 포함하며 모델에서 필요한 정보를 받아 와서 템플릿에 전달하는 역할을 한다.
- View 는 Model과 Template을 연결하는 역할을 한다.
- URLConf 에 매핑된 Callable Object
==> 첫번째 인자로 HttpRequest 인스턴스를 받는다.
==> 반드시 HttpResponse 인스턴스를 리턴 해야 한다.
예제)
-----------------------------------------------------blog.views.py--------------------------------------------------------------------------------
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def post_list(request):
myname = '장고'
return HttpResponse('''<h1>Hello {name}</h1>
<p>Http Method {method}</p>'''.format(name=myname, method=request.method))
참고) 문자열 앞에 'f' 를 붙이면 변수를 직접 써도 된다.
return HttpResponse(f'''<h1>Hello {myname}</h1>
<p>Http Method : {request.method}</p>'''))
# Template 의 역할
- Template 은 정보를 일정한 형태로 표시하기 위해 재사용 가능한 파일을 말함
- Django 의 template 양식은 HTML 을 사용한다.
- 템플릿은 blog/templates/blog 디렉토리에 저장한다. 여기서 보면 blog 가 두번 나온다. 이유는????
프로젝트 안에 여러앱이 있을때, django는 template을 한번에 다 읽어 들이는데....이때 각 template 들을 구분할 방법이 필요하다. 그래서, templates 하위 디렉토리에 app 이름에 해당하는 디렉토리를 하나 더 만든다.
-----------------------------------------------------blog.views.py--------------------------------------------------------------------------------
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here. 기본형태로, 실제로는 이렇게 사용하지 않음
# def post_list(request):
# myname = '장고'
# return HttpResponse('''<h1>Hello {name}</h1>
# <p>Http Method {method}</p>'''.format(name=myname, method=request.method))
def post_list(request):
return render(request, 'blog/post_list.html') # 여기서 경로는 templates 디렉토리 아래부터시작하는 경로다.
# QuerySet 이란?
- 쿼리셋은 DB로부터 데이터를 읽고, 필터링을 하거나, 정렬을 할 수 있다.
- 쿼리셋을 사용하기 위해 먼저 python sheel 을 실행한다.
python manage.py shell
# Template에서 동적 데이터 사용하기
- 변수의 값을 사용하려면 중괄호를 사용
- {% for %} 와 {% endfor } 사이에서 목록의 모든 객체를 반복하여 출력
# Template Engine
- Django 기본 지원 템플릿 엔진
- Syntax
가) 상속 (공통으로 사용하는것을 상속받음 됨)
{% extends "base.html" %}
1) Variables
- {{ 변수명 }}
- {{ mydict.key }} : dict의 key 에 attr처럼 접근
- {{ myobj.attr }}
- {{ myobj.func }} : 함수 호출도 attr 처럼 접근. 인자 있는 함수 호출 불가
- {{ mylist.0 }} : 인덱스 접근도 attr 처럼 접근
2) Template Tag
- {% %} 1개 쓰이기도 하며, 2개 이상이 조합되기도 함
- 빌트인 Tag 가 지원되며, 장고앱 별로 커스텀 Tag 추가 기능
3) block tag
- 템플릿 상속에서 사용
- 자식 템플릿이 오버라이딩 할 block 영역을 정의
- 자식 템플릿이 부모가 정의한 block 에 한해서 재 정의만 가능. 그 외는 모두 무시됨
{% block block-name %}
block 내에 내용을 쓸 수 있다.
{% endblock %}
4) Comment tag : 템플릿 주석
{% comment "Optional note" %}
이 부분은 렌더링 되지 않음
{% endcomment %}
---예제)
<!-- HTML 주석..페이지 소스보기 하면 나옴 -->
{% comment "django 주석..페이지 소스보기해도 안나옴 " %}
{% endcomment %}
# Django Templates Tag Documentation
https://docs.djangoproject.com/en/3.0/ref/templates/builtins/
# CSS 적용하기
- static 디렉토리안에 css 디렉토리를 만들고 blog.css 라는 파일을 작성.
- 반드시 장고를 재기동해야함.
예제)
css파일
---------
h1 a {
color: #FCA205;
font-family: 'Lobster';
}
body {padding-left: 15px;}
html파일
--------------
{% load static %} <============== 이 문장이 반드시 들어가야 함
<html>
<head>
<title> Hello Myblog </title>
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
#bootstrap
적용법:
ㅇㄹㅇㄴ
#템플릿 상속하기
1) 기본 템플릿 html 생성하기
- 기본 템플릿은 웹사이트 내 모든 페이지에 확장되어 사용된느 가장 기본적인 템플릿이다.
- blog/templates/blog/에 base.html 파일을 생성한다.
- post_list.html에 있는 모든 내용을 base.html에 아래 내용을 복사해 붙여 넣는다.
예제)
#Django Form
1) Form이란?
- JAVA 의 경우 DB 연결 Form과 화면 Form 을 공유해서 쓰는 경우도 있는데, Django 는 명확히 구분됨.
- Model 클래스와 유사하게 Form 클래스를 정의
- 주요 역할 : 커스텀 Form 클래스를 통해
*입력 폼 HTML 생성: 다음 방식을 기본 제공
.as_table() : Table 형태로 Form 을 만듬
.as_p() : --추가 주석 달것
.as_ul() : --추가 주석 달것
*입력 폼 값 검증(validation) 및 값 변환이 가능함
2) Form 처리: HTTP Method에 따라
-폼 처리 시에 같은 URL(즉 같은 뷰)에서 GET/POST 로 나눠 처리
-GET방식으로 요청: 입력 폼만을 보여준다.
-POST방식으로 요청: 데이터를 입력 받아 유효성 검증 과정을 거칩니다.
=> 검증 성공 시: 해당 데이터를 저장하고 SUCCESS URL로 이동
=> 검증 실패 시: 오류 메시지와 함께 입력 폼을 다시 보여준다.
#Middleware
1) settings.py 파일의
MIDDLEWARE 부분에 등록되어 있음.
아래 아키텍쳐 이미지를 이해하고, 잘 기억하는게 좋을 것 같다.
위 그림은 블로그.lostcatbox.com/2019/11/15/django03/ 에서 캡쳐함
#Django ModelForm
- Model Form이란....지정된 Model로부터 필드 정보를 읽어 들여, form fields 를 세팅한다.
- 클래스 생성시...ModelForm 을 상속받는다.
- Inner Class 형태로 Meta 클래스 생성
- model 이란 변수에 Model 클래스를 복사해주고, fields 라는 변수에 전체 필드나 읽어올 특정 필드들만 지정한다.
- 내부적으로 model instance 를 유지
- 유효성 검증에 통과한 값들로, 지정 model instance 로의 저장(save)을 지원(Create or Update)
d
'IT > django' 카테고리의 다른 글
Django로 e-commerce 개발할 때 참고하기 좋은 오픈소스 (0) | 2022.10.14 |
---|---|
django 장고 ubuntu 우분투 설치및 테스트 (0) | 2021.06.07 |
우분투(ubuntu)에서 파이썬 가상 환경 만들기 (0) | 2021.05.13 |
댓글