Django ViewClass 2-1) To-do management project settings

Turtle·2023년 12월 7일
0
post-thumbnail
  • Django는 익명의 사용자와 인증된 사용자 모두에게 쿠키 및 세션 기반 메시징을 완벽하게 지원
  • 메시지 프레임워크를 사용하면 한 요청에 메시지를 임시로 저장하고 후속 요청에 표시하기 위해 검색할 수 있다. 모든 메시지에는 우선순위를 결정하는 특정 수준으로 태그가 지정이 된다.

📌Message Framework - Enabling messages

  • 메시지는 미들웨어 클래스와 해당하는 컨텍스트 프로세서를 통해 구현이 된다.
  • 우리가 django-admin startproject 명령어를 통해 생성한 프로젝트는 메시지 기능을 활성화하는데 필요한 모든 설정이 이미 settings.py에 포함이 되어있다.
INSTALLED_APPS = [
    'django.contrib.messages',
	# ...
]

MIDDLEWARE = [
    'django.contrib.messages.middleware.MessageMiddleware',
	# ...
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'pages',)],
        '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',
            ],
        },
    },
]
  • 위와 같이 settings.py에 보면 INSTALLED_APPSMIDDLEWARE에 메시지 프레임워크 기능에 대한 부분이 들어있는 것을 볼 수 있다.
  • 기본 스토리지 백엔드는 세션에 의존한다. 그렇기에 세션 미들웨어가 메시지 미들웨어보다 먼저
    표시되어야 한다.
  • TEMPLATES 설정에 정의된 DjangoTemplates 백엔드의 context_processors 옵션에는 'django.contrib.messages.context_processors.messages'이 포함되어 있다.
  • 만약 메시지를 사용하고 싶지 않다면 settings.py에서 위와 같이 메시지를 나타내는 부분들만 제거를 하고 사용하면 된다.

📌Configuring the message engine

  • 메시지 프레임워크는 다양한 백엔드를 사용하여 임시 메시지를 저장할 수 있다.
  • Django는 django.contrib.messages에 3가지 내장 스토리지 클래스를 제공한다.

    ①. 클래스 storage.session.SessionStorage

  • 이 클래스는 요청 세션 내부에 모든 메시지를 저장한다. 따라서 Django의 contrib.session 애플리케이션이 필요하다.

    ②. 클래스 storage.cookie.CookieStorage

  • 이 클래스는 메시지 데이터를 쿠키(조작 방지를 위한 비밀 해시로 서명됨)에 저장하여 요청 전반에 걸쳐 알림을 유지한다. 쿠키 데이터 크기가 2048바이트를 초과하면 이전 메시지가 삭제된다.

    ③. 클래스 storage.fallback.FallbackStorage

  • 이 클래스는 먼저 CookieStorage를 사용하고 단일 쿠키에 맞지 않는 메시지에 대해 SessionStorage를 사용하도록 대체한다. 또한 Django의 contrib.sessions 애플리케이션이 필요하다.

Message Levels

ConstantPurpose
DEBUG서비스 배포에서 무시(혹은 제거)되는 개발 관련 메시지
INFO사용자를 위한 정보 메시지
SUCCESS"귀하의 프로필이 성공적으로 업데이트 되었습니다"와 같이 성공적으로 동작이 이루어졌을 때
WARNING오류가 발생하지 않았지만 아마도 발생할 수 있음
ERROR작업을 성공하지 못했거나 다른 오류가 발생

Message tags

Level ConstantTag
DEBUGdebug
INFOinfo
SUCCESSsuccess
WARNINGwarning
ERRORerror
  • 메시지 레벨에 대한 기본 태그를 바꾸기 위해 사용자가 바꾸기를 원하는 레벨을 포함해 MESSAGE_TAGE 설정을 객체로 만들면 된다.
from django.contrib.messages import constants as messages

MESSAGE_TAGS = {
    messages.INFO: "",
    50: "critical",
}

Adding a message

  • 메시지는 다음과 같이 추가할 수 있다.
from django.contrib import messages

messages.add_message(request, messages.INFO, "Hello world.")

messages.debug(request, "%s SQL statements were executed." % count)
messages.info(request, "Three credits remain in your account.")
messages.success(request, "Profile details updated.")
messages.warning(request, "Your account expires in three days.")
messages.error(request, "Document deleted.")

Displaying messages

  • 템플릿에서 메시지를 보여주고 싶다면 아래와 같이 작성할 수 있다.
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

참고자료 - Django 공식문서 The messages framework


📌Serving files uploaded by a user during development

  • 개발 중에 django.views.static.serve() 뷰를 사용하여 MEDIA_ROOT에서 사용자가 업로드한 미디어 파일을 제공할 수 있지만 이는 적합하지 않다. 예를 들어 MEDIA_URL이 /media/로 정의된 경우 urls.py에 다음과 같은 코드를 추가하면 된다.
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

📌Model field reference

# gettext_lazy를 매 선택지마다 쓰는 불편함을 피하기 위해 alias(별칭)을 사용
from django.utils.translation import gettext_lazy as _

class Student(models.Model):
    class YearInSchool(models.TextChoices):
        FRESHMAN = "FR", _("Freshman")
        SOPHOMORE = "SO", _("Sophomore")
        JUNIOR = "JR", _("Junior")
        SENIOR = "SR", _("Senior")
        GRADUATE = "GR", _("Graduate")

    year_in_school = models.CharField(max_length=2, choices=YearInSchool,default=YearInSchool.FRESHMAN)

Django Model Fields Reference - Choice Example

  • 선택지가 제공되면 모델 유효성 검사에 의해 적용되며 기본 양식 위젯은 표준 텍스트 필드 대신 이러한 선택지가 포함된 선택 상자(Select Box)가 된다.
  • 매핑이 제공되면 key element는 모델에 설정할 실제 값이고, second element는 사람이 읽을 수 있는 이름이 된다.
  • 위의 예시 코드를 기준으로 볼 때 FR, SO, JR, SR, GR 등의 key element가 모델에 설정될 값이 되는 것이고 Freshman, Sophomore, Junior, Senior, Graduate 등의 second element가 사용자의 눈에 보여지는 값이 되는 것이다.

📌적용

할 일(Task) - field name

  • 제목(title)
  • 종류(type)
  • 마감기한(due)
  • 생성일(created_at)

체크리스트(ChecklistItem) - field name

  • 할 일(task) - ForeignKey(외래키)로 연결
  • 내용(content)
  • 체크여부(checked)
  • 생성일(created_at)
from django.db import models
from django.utils.translation import gettext_lazy as _ # Django의 다국어 기능 지원

# Create your models here.
class Task(models.Model):
    class TaskType(models.TextChoices):
        JOB = 'JOB', _('업무')
        HEALTH = 'HEALTH', _('건강')
        SOCIAL = 'SOCIAL', _('사회')
    
    title = models.CharField(max_length=50, null=False)
    type = models.CharField(choices=TaskType.choices, max_length=10, default=TaskType.JOB)
    
    due = models.DateTimeField(null=False)
    created_at = models.DateTimeField(null=False)
    
class ChecklistItem(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    content = models.CharField(max_length=100, null=False)
    checked = models.BooleanField(null=False, default=False)
    created_at = models.DateTimeField(auto_now_add=True, null=False)

0개의 댓글