Django를 공부하면서 매일마다 속도가 빠르진 않아서 답답하기도 하지만 많은 것을 배워간다.
그 중에서 후에 필요한 부분이 LoginRequiredMixin 이다.
#1 개요
LoginRequiredMixin는 CBV 방식과 궁합이 맞게끔 설계가 된것같다.
그리고 이 LoginRequiredMixin의 기능은, CBV 클래스에 상속받았을때,
해당 클래스로 구동되는 기능에 대하여는 로그인을 해야만 접근이 가능하게끔 설계가 되어있다.
다른 말로는 로그인을 하고, 해당 url에 접근을 해야지
status code가 200이 뜬다.
#2 실사용 예
나의 경우를 예로 들어보겠다.
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
# code line
class Post(models.Model):
title = models.CharField(max_length=30)
# 노출되는 글씨의 수를 제한적으로 보여주는 소제목의 용도로 사용하기 위해 만든다고 보면 될것같다
hook_text = models.CharField(max_length=100, blank=True)
content = models.TextField()
# 설명1. upload_to
# 이거는 지정된 위치의 폴더에 연도/시간/일 단위로 쪼개서
# 폴더를 분산해서 데이터베이스에 저장한다는 의미다.
# 폴더를 분산하면 데이터를 서치하는게 용이하지만,
# 하나의 폴더에서 여러개의 파일을 찾는것은 시간적으로 좋지 않다고 한다.
# 설명2. blank = True
# 필수로 채우지 않아도 상관없다는 의미
# 즉, 이 경우에는 "이미지 업로드를 해도되고 안해도되"라는 의미
head_image = models.ImageField(
upload_to='blog/images/%Y/%m/%d/', blank=True)
file_upload = models.FileField(
upload_to='blog/files/%Y/%m/%d/', blank=True)
# auto_now_add는 "최초 저장시"에만 저장이 되고
created_at = models.DateTimeField(auto_now_add=True)
# auto_now는 "수정 후 save를 할때마다"최신화 되어 적용된다.
updated_at = models.DateTimeField(auto_now=True)
# 기존 author 모델이고, 이대로 사용할 시, 작성자(author를 삭제하면 이 작성자가 작성한
# 게시글은 모조리 삭제된다.
# author = models.ForeignKey(User, on_delete=models.CASCADE)
# SET_NULL을 하게되면 작성자 계정이 사라져도 게시글은 남아있다.
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
# 텍스트, 숫자의 null은 null이고, 계정, 카테고리등 목록선택창에서의 null은 blank이다.
category = models.ForeignKey(
Category, on_delete=models.SET_NULL, null=True, blank=True)
tags = models.ManyToManyField(Tag, blank=True)
def __str__(self):
return f'[{self.pk}]{self.title} :: {self.author}'
# 이것을추가해 줌으로써 admin 페이지에서 볼때는 "View on site"라는 버튼이 생성되었다.
def get_absolute_url(self):
return f'/blog/{self.pk}'
# 첨부파일의 이름을 확인
def get_file_name(self):
return os.path.basename(self.file_upload.name)
# 첨부파일의 확장자를 확인
def get_file_ext(self):
return self.file_name().split('.')[-1]
# blog/views.py
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post
# code line
class PostCreate(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'hook_text', 'content',
'head_image', 'file_upload', 'category']
1)
일단 CreateView를 PostCreate라는 클래스에 상속받았고,
그에 따라서 post라는 models을 사용하여 fields 값을 채워넣는 폼을 사용하고자 했다.
2)
사용하고 있던 CreateView에는 로그인 유저, 비로그인 유저 가릴 것 없이 포스트 작성이 가능했다.
이를 방지하기 위해 views에서 LoginRequiredMixin을 PostCreate라는 클래스에 상속받아줬다.
3) 결과적으로 현재로써는 비 로그인자가 포스트를 작성하려고하면 Page not found 404에러가 뜬다.
'개발일지 > Django' 카테고리의 다른 글
Django - ORM(모델명, 테이블명 생성원리, sqlite 인터프리터 기초 명령문) (1) | 2023.01.07 |
---|---|
Django - markdownx, ImportError: cannot import name 'url' from 'django.conf.urls' 해결 (2) | 2023.01.04 |
Django - (fields.E320)models on_delete=SET_NULL ERRORS 해결 (1) | 2023.01.02 |
Django - It is impossible to add a non-nullable field (해결 및 설명) (1) | 2023.01.02 |
Django - CBV 방식 시리즈2 (DetailView) 완벽설명이라고 볼수있음 (0) | 2022.12.31 |