들어가며
장고 개발 환경 세팅 : 처음에는 장고 환경 세팅도 시간을 퍽 많이 잡아먹는 것 같습니다… 때문에 장고로 개발하는 환경 세팅을 정리해보았습니다.
App 추가
settings의 INSTALLED_APPS는 startapp으로 먼저 필요한 app을 추가해준 다음에 적어줘야 ModuleNotFoundError
가 뜨지 않습니다.
python manage.py startapp accounts
python manage.py startapp products
python manage.py startapp profiles
...
장고 settings.py 설정
환경 변수 미사용
# Application definition
CUSTOM_APPS = [
'articles',
'users',
]
SYSTEM_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',
'rest_framework',
]
INSTALLED_APPS = CUSTOM_APPS + SYSTEM_APPS
# static
STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / "static"]
STATIC_ROOT = BASE_DIR / "staticfiles"
# Media files
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
환경 변수 사용 (.env)
- 환경변수를 사용해서 settings.py를 설정해주기 위해서는 프로젝트 디렉토리 하위에 .env 파일 생성 후 아래 코드 입력
- django_extensions, django_seed, DRF 등 앱을 추가로 설치해서 사용하는 경우, 해당 추가 app들 SYSTEM_APPS에 추가
SECRET_KEY = ''
CUSTOM_APPS = 'accounts'
SYSTEM_APPS = 'django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,django_extensions,django_seed,rest_framework'
- settings.py에 os.environ.get() 으로 환경변수 값 가져옴
SECRET_KEY = os.environ.get('SECRET_KEY')
CUSTOM_APPS = os.environ.get('CUSTOM_APPS').split(',')
SYSTEM_APPS = os.environ.get('SYSTEM_APPS').split(',')
INSTALLED_APPS = SYSTEM_APPS + CUSTOM_APPS
django-dotenv 패키지 설치
pip install django-dotenv
manage.py 하단에 다음 코드 추가
import dotenv
if __name__ == '__main__':
dotenv.read_dotenv()
main()
자세한 환경 변수 설정법
django 관련 패키지 설치
django shell 관련
pip install ipython
pip install django-extensions
이미지 관련
pip install pillow
모델 관련
pip 설치 후, INSTALLED_APPS에 ‘django_seed’ 추가해야 함
pip install django-seed
디버그 관련
pip install django-debug-toolbar
pip 설치 이후 추가 설정 필요
- INSTALLED_APPS 에 ‘debug_toolbar’를 추가
- MIDDLEWARE 에 ‘debug_toolbar.middleware.DebugToolbarMiddleware’를 추가
- INTERNAL_IPS = (‘127.0.0.1’,)를 추가
- urls.py에 아래 코드 추가
from django.conf.urls import url, include
if settings.DEBUG:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
DRF 관련
pip install djangorestframework
- INSTALLED_APPS에 ‘rest_framework’ 추가
Template 관련
DIRS 수정
MVT 패턴으로 개발하는 경우, 각 app마다 template 디렉토리 뒤지도록 settings에 'DIRS': [os.path.join(BASE_DIR, 'templates')]
수정
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]
기본 Template 구조
base.html
<!DOCTYPE html>
<html lang="ko">
{% include 'head.html' %}
<body>
{% include 'header.html' %}
{% block content %}
{% endblock %}
{% include 'footer.html' %}
</body>
</html>
index.html
{% extends 'base.html' %}
{% block content %}
<div style="height: 40rem; background-color: #EADBC8; border-radius: 1rem; margin: 2rem">
<h1>첫 페이지 시작</h1>
</div>
{% endblock %}
head에 필요한 CDN 추가
head.html
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SpartaMarket</title>
{% load static %}
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"
crossorigin="anonymous"
/>
<!-- GOOGLE FONT LINK -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Workbench&display=swap"
rel="stylesheet"
/>
<!-- daisyUI -->
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.10.2/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.tailwindcss.com"></script>
<!-- DEFAULT CSS LINK -->
<link rel="stylesheet" type="text/css" href="{% static 'css/base.css' %}">
</head>
media
개발 모드일 때 settings.py에서 우리가 지정한 경로로 media를 찾을 수 있게 아래 코드를 작성해 줍니다.
urls.py
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
이미지 파일을 전송 받는 form의 경우 enctype="multipart/form-data"
속성을 추가
template
<form action="{% url 'articles:create' %}" method="POST" enctype="multipart/form-data">
### pip install 모음
모델 관련
필요한 import
- settings는 user 모델을 연관 시킬 때 사용 (아래 예시)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user")
from django.db import models
from django.conf import settings
관리자 생성
python manage.py createsuperuser # 슈퍼유저 생성
Auth 관련
로그인
views.py
python
from django.shortcuts import render, redirect
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
from django.contrib.auth.forms import AuthenticationForm
from django.views.decorators.http import require_POST, require_GET, require_http_methods
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
@require_http_methods(['GET', 'POST'])
def login(request):
if request.method == "POST":
form = AuthenticationForm(data=request.POST)
if form.is_valid():
auth_login(request, form.get_user())
return redirect("articles:articles")
else:
form = AuthenticationForm()
context = {"form": form}
return render(request, "accounts/login.html", context)
@require_POST
def logout(request):
auth_logout(request)
return redirect("articles:index")
로그인 여부에 따라 template 표기
template
html
{% if request.user.is_authenticated %}
…
{% else %}
…
{% endif %}
```
사용자 여부에 따라 template 표기
요청한 사용자와 모델 데이터에서 가져온 사용자가 동일한지 확인
{% if request.user == objs.user %}
참고하면 좋은 글
Django settings | Django documentation | Django (djangoproject.com)
장고 시작하기 1 : 장고 환경 구성하기
장고를 시작하기 위해서는 장고를 설치하고 장고만의 환경을 만들어줘야 합니다. 장고가 정상적으로 설치되고 환경 구성이 완료되면 장고 로켓 화면을 볼 수 있습니다
장고 시작하기 2 : startapp으로 app 추가
[장고 시작하기] 2 번째 시리즈 : 지난 시간에 Django 환경 세팅하는 것에 대해서 공부하고 정리해보았습니다. 이번에는 실제 장고로 웹 페이지를 구성하기 위해서 ‘startapp으로 app 추가’ 하는 법에 대해서 공부하고 정리해 보았습니다.
장고 시작하기 3. 장고 extend include 사용하여 template 관리
장고 extend, include : 각 페이지 마다 html을 만들 수 있지만 페이지가 조금만 늘어나도 html을 구조화해서 재사용하고 싶어집니다. 이를 구현하기 장고에서는 extend와 include 태그를 제공해줍니다.
장고 시작하기 4. 장고 화면 꾸미기 기초 (장고 static 파일 관리)
CSS, 글꼴, 이미지 파일, 자바스크립트 파일 등 웹 사이트를 꾸미기 위한 정적 파일들을 있습니다. Django에서는 이런 파일들을 static 디렉토리에서 관리합니다. 하지만 이 static 디렉토리가 자동으로 생성되지 않습니다.
장고 시작하기 5 : 서버와 클라이언트 데이터 주고받기
장고 기초에서의 제일 중요한 내용이 “서버와 클라이언트가 어떻게 데이터를 주고 받는지” 인 것 같습니다. GET은 URL 뒤에 ?쿼리 형식으로 데이터를 보내고, 작은 데이터를 서버로 보낼 때 사용합니다. POST는 INSERT, UPDATE 때 사용되며, 데이터가 BODY에서 전송됩니다.두 방식 모두 form 태그를 사용하는데요
장고 시작하기 6 : 장고 DTL 동적 페이지 구축을 위한 기본 문법 1
Django Template Language (DTL)은 동적 웹 페이지를 구축하기 위한 강력한 도구입니다. 이를 통해 개발자는 Django views에서 제공하는 데이터를 기반으로 HTML로 동적으로 렌더링되는 템플릿을 만들 수 있습니다.
장고 시작하기 7 : 장고 URL, variable routing, name 파라미터
“장고 URL”을 다루는 정말 편리한 기술들이 많습니다. 모르면 암호 같은 표기인데 알고 나면 너무 편리한 기능들인 거죠. 이런 기능들에는 Variable Routing과 Naming URL 패턴이 있습니다.
장고 시작하기 8 : 장고 Model 생성하기
“장고 Model”은 데이터베이스 테이블을 나타내는 Python 클래스입니다. 데이터베이스에 저장된 데이터의 구조와 동작을 정의할 수 있는거죠. 장고 Model의 장점은 데이터베이스에 구애 받지 않는다는 점 입니다.
장고 시작하기 9. 장고 ORM 개념, 장고 Shell에서 테스트하기
장고 ORM (Object-Relational Mapping)은 개발자가 Python 객체를 사용하여 데이터베이스와 상호 작용할 수 있게 해주는 기능으로, SQL 쿼리를 직접 작성하지 않아도 단순하게 DB 작업을 할 수 있게 만들어 줍니다.
장고 시작하기 10. 장고 CRUD
CRUD는 아시다시피 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete)를 의미하며 데이터베이스의 데이터에 대해 수행할 수 있는 4가지 기본 작업을 나타내는데요. 이번 포스트에서는 장고 CRUD 는 어떻게 진행