Django MTV
Django
- django는 MTV(Model-Template-View) 패턴 기반 프레임워크
- 각 요소와 주요 개념, 다양한 옵션에 대한 학습
Model
model
- Django 웹 애플리케이션은 모델이라는 파이썬 객체를 통해 데이터에 접속하고 관리
- 모델은 저장된 데이터의 구조를 정의
- 하나의 모델 클래스가 하나의 DB 테이블
- 모델에는 필드 타입, 데이터의 최대 크기, 기본 값, 선택 리스트 옵션 등이 있음
- 모델의 정의는 기초 데이터 베이스에 대해서 독립적
- Model 등록 절차
- models.py에서 모델 클래스 정의
- shell에서 migrations, migrate 실행
- admin.py에 모델클래스 등록
field
-
모델은 모든 타입의, 임의 숫자 필드를 가질 수 있음
-
각각의 필드는 데이터베이스 테이블에 저장할 데이터 column을 나타냄
-
필드타입
- AutoField: ID로 사용가능한 자동으로 증가하는 integerField. 모델의 기본키 필드는 별도 지정하지 않으면 자동으로 추가됌
- BigAutoField: 1 ~ 9223372036854777807까지 숫자에 맞도록 보장. 64비트 정수
- BigIntegerField: -9223372036854 ~ 9223372036854777807까지까지 숫자 보장. 기본 필드 위젯은 text input
- BooleanField: true / false field, None에 대한 허용이 필요하다면 NullBooleanField를 사용해야함
- CharField: 작은 문자열에서 큰 사이즈의 문자열을 위한 문자열 필드. 많은 양의 텍스트일 경우 TextField를 사용해야함
- 추가적으로 max_length(필드의 최대길이)를 지정할 수 있음. 필수 인수
- DateField: 날짜 필드
- auto_now: 객체가 저장될 때마다 매번 자동으로 필드를 현재시간이 설정
- auto_now_add: 객체가 처음 생성될 때 자동으로 현재시간이 설정
- DateTimeField: 날짜 시간 필드
- DecimalField: 고정소수. 두 개의 필수 인수가 있음
- max_digits: 숫자에 허용되는 최대 자리수
- decimal_places: 숫자와 함께 저장될 소수 자릿수
- EmailField: 유효한 이메일 주소인지 체크하는 CharField. 입력값을 검증하는데 EmailValidator 사용
- FileField: 파일 업로드 필드. primary key 인수를 지원하지 않고 사용할 경우 에러 발생
- ImageField: FileField로 부터 모든 속성과 메서드를 상속받지만 유효한 이미지인지 검증
- IntegerField
-
필드 옵션
- blank: validation시에 empty 허용 (default=False)
- null: 허용 여부 (default=False)
- db_index: 인덱스 필드 여부 (default=False)
- default 값 지정, 혹은 return 함수 지정
- unique: 현재 테이블 내 유일성 여부 (default=False)
- choice: select 박스 사용시 사용
- verbose_name: 필드 레이블, 미지정시 필드명 사용
- primary_key: 해당 필드가 primary key임을 표시
-
관계형 필드
-
모델을 설계하는데 매우 중요한 개념.
-
on_delete (필드 간의 관계에서 삭제에 대한 옵션)
- 1인 쪽의 데이터가 삭제 되었을 때 N의 데이터를 어떻게 처리 할지에 대한 설정
- CASCADE: 이와 연결되어 있는 모든 N쪽 데이터를 삭제
- PROTECT: 1인 쪽의 데이터가 삭제 되지 않도록 보호해줌
- SET_NULL: null 값으로 대체하게 되어 필드에 null=True 옵션이 있어야함
- SET_DEFAULT: default로 값을 대체하게 되어 필드에 default=True 옵션이 있어야만 가능
- DO_NOTHING: 아무것도 하지 않지만 db에서 오류가 날 수 있음
- SET: 대체할 값을 지정
-
ForeignKey
- 1:N 관계를 의미
- ex) 한 명의 유저가 쓰는 다수의 포스팅, 한 명의 유저가 쓰는 다수의 댓글, 게시글과 댓글
class Post(models.Model): pass class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE)
-
OneToOneField
- 1:1 관계를 의미
- ex) 한 명의 유저는 한 개의 프로필
class User(AbstractBaseUser): pass class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)
-
ManyToManyField
- M:N 관계를 의미
- M:N 관계에서 어느 쪽이라도 필드 지정이 가능
- 한 개의 포스팅에 여러개의 태그, 한 개의 태그에 여러개의 포스팅
class Post(models.Model): pass class Article(models.Model): pass class Tag(models.Model): name = models.CharField(max_length=100, unique=True) post_set = models.ManyToManyField('Post', blank=True) article_set = models.ManyToManyField('Article', blank=True)
-
reverse_name
- 참조 대상이 되는 모델에서 본인을 참조하는 모델의 데이터를 접근 할 때 사용하는 형식
- default: 모델명소문자_set
-
-
ex)
my_field_name = models.CharField(max_length=20, help_text='Enter field documentation', primary_key=True) class Product(models.Model): owner = models.ForeignKey(User, on_delete=models.CASCADE)
Meta
-
메타 데이터는 다른 데이터에 대한 정보를 제공하는 특정 데이터 집합
-
메타 클래스는 권한, 데이터베이스 이름, 단/복수 이름, 추상화, 순서 등과 같이 모델에 대한 사항을 정의하는데 사용(선택사항)
-
메타 데이터의 가장 유용한 기능 중 하나는 모델 타입을 쿼리할 때 반환되는 기본 레코드 순서를 제어(sorting)
-
django meta option
- db_table: 데이터 베이스 내에서 테이블을 식별하는데 사용해야하는 이름을 설정
- ordering: 모델 객체의 순서를 정으하는데 사용
- verbose_name: 사람이 읽을 수 있는 모델 객체의 이름으로 관리자 화면등에 등장
-
주요 메소드가 위치하는 순서
-
모든 데이터베이스 필드
-
커스텀 매니저 속성
-
Meta 클래스
-
def init() 메소드
-
def str() 메소드
-
def save() 메소드
-
def get_absolute_url() 메소드
-
기타 커스텀 메소드
class Meta: db_table = 'data_table' ordering = ['-my_field_name']
-
Method
-
모델은 메소드를 가질 수 있음
-
최소한 모든 모델마다 표준 파이썬 클래스의 메소드은 str()을 정의하여 각각 object가 사람이 읽을 수 있는 문자열을 반환 하도록 해야함
-
이 문자열은 관리자 사이트에 잇는 개별적인 레코드들을 보여주는데 사용
-
ex)
def __str__(self): return self.field_name
Template
- 사용자에게 보여지는 부분
- 뷰에서 로직을 처리한 후 html파일을 context(==return data)와 함께 렌더링
- django는 template 문접 지원. 이 문법을 통해 html 내에서 context로 받은 데이터 활용가능
View
Django View
- 비즈니스 로직이 담긴 곳(controller)
- django에는 CBV(class based view), FBV(function based view)의 두 가지의 뷰가 존재
- 특히 CBV는 django에서 제공하는 제네릭 뷰를 상속해서 여러가지 기능을 편리하게 사용할 수 있음
CBV
-
장고는 클래스 기반 뷰를 작성하는 표준화된 방법을 제공
-
뷰 클래스가 내장 함수를 반환하는 as_view() 클래스 매서드를 제공
-
django.views.generic.View에서 해당 매커니즘이 구현되며 모든 클래스 기반 뷰는 이클래스를 직간접적으로 상속 받음
-
클래스 기반 뷰를 이용할 때 가이드 라인
- 뷰 코드의 양이 적으면 적을 수록 좋음
- 뷰 안에서 같은 코드를 반복적으로 이용하는 것을 지양
- 뷰는 프레젠테이션 로직에서 관리. 비즈니스로직은 모델에서 처리. 특별한 경우는 폼에서 처리
- 에러 핸들링에 클래스 기반 뷰는 사용하지 않음. 대신 함수 기반 뷰를 사용
-
믹스인
-
실체화된 클래스가 아니라 상속해 줄 기능들을 제공하는 클래스
-
프로그래밍에서 다중 상속을 해야할 때 믹스인을 쓰면 클래스에 더 나은 기능과 역할을 제공할 수 있음
-
믹스인을 이용하여 뷰 클래스를 작성할 때는 몇 가지 규칙이 있음
-
django가 제공하는 기본 뷰는 항상 오른쪽
-
mixin은 기본 뷰 부터 왼쪽
-
minxin은 파이썬의 기본 객체 타임(object)를 상속
from django.views.generic import TemplateView # 파이썬 기본 객체 타입인 object를 상속 받고 있음 class FreshFruitMixin(object): def get_context_data(self, **kwargs): context = super(FreshFruitMixin, self).get_context_data(**kwargs) context['has_fresh_fruit'] = True return context # Minin과 View를 동시에 상속받고 있음 class FruityFlavorView(FreshFruitMixin, TemplateView): template_name = "fruity_flavor.html"
-
-
-
제네릭 클래스 기반 뷰 종류
- View: 어디서든 이용 가능 한 뷰. 항상 간접적으로 사용되는 뷰
- init: as_view에 인자를 넘겨줌. 이를 순회하며 해당 설정을 해줌. ex) template_name 값이 있다면 이에 값을 할당
- as_view: view를 하나 만들어서 이를 return
- dispatch: as_view 매소드 내에서 호출. request method를 확인하고 정상적인 method라면 request에서 이를 가져옴. 만약 아니라면 http_method_not_allowed
- RediectView: 사용자를 다른 URL로 리다이렉트
- TemplateView: 장고 HTML 템플릿을 보여줄 때
- ListView: 객체 목록
- DetailView: 객체를 보여줄 때
- FormView: 폼 전송
- CreateView: 객체 생성
- UpdateView: 객체를 업데이트할 때
- DeleteView: 객체를 삭제할 때
- generic dateview: 시간 순서대로 나열해서 보여줄 떄
.
.
.
- View: 어디서든 이용 가능 한 뷰. 항상 간접적으로 사용되는 뷰
-
제네릭 뷰 오버라이딩
- model
- queryset
- template_name
- context_object_name
- date_field
-
매소드 오버라이딩
- get_queryset()
- get_context_data(**kwargs)
- form_valid(form)
FBV
- 심플하고 가독성이 좋음
- 코드를 확장하거나 재사용하기 어려움. 조건문으로 HTTP 메소드를 구본해야함
def index(request):
if request.method == 'POST':
# POST 요청일경우
else:
# POST 요청이 아닐 경우
Author And Source
이 문제에 관하여(Django MTV), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ryu_log/Django-MTV저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)