> winget install --id=Microsoft.PowerShell --silent
> winget install --id=Microsoft.WindowsTerminal --silent
> winget install --id=JetBrains.PyCharm.Professional --silent
> winget install --id=Microsoft.VisualStudioCode --silent
> winget install --id=Python.Python.3.11 --silent
> winget install --id=Python.Python.3.12 --silent
> winget install --id=OpenJS.NodeJS.LTS --silent
> winget install --id=Git.Git --silent
> mkdir myproject
> cd myproject
> python -m venv venv
> venv/Scripts/Activate (if linux, source ./venv/bin/activate)
> python -m pip install --upgrade pip
> python -m pip install "django==0.0.0"
> python -m django startproject mysite .
<requirements.txt>
django==0.0.0
<.gitignore>
__pycache__
migrations
/mediafiles
/staticfiles
venv
db.sqlite3
secret.json
.idea
.vscode.
.env
> python -m pip install djlint
python -m djlint --reformat --format-css --format-js --indent 2 --quiet --profile django .
> python -m pip install black
<settings.json>
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true
},
"[html][django-html][handlebars][hbs][mustache][jinja][jinja-html][nj][njk][nunjucks][twig]": {
"editor.defaultFormatter": "monosans.djlint"
}
}
>python manage.py startapp accounts
<mysite/settings.py>
INSTALLED_APPS = [
"django.contrib.admin",
.
.
.
"accounts",
]
<accounts/urls.py>
from django.urls import path
from . import views
urlpatterns = []
<mysite/urls.py>
from django.urls import include
urlpatterns = [
.
path("accounts/", include("accounts.urls")),
]
<accounts/models.py>
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
<mysite/settings.py>
AUTH_USER_MODEL = "accounts.User" # accounts.models.User(x)
>python manage.py makemigrations accounts
>python manage.py migrate
>python manage.py createsuperuser
공식웹: django-debug-toolbar.readthedocs.io
>python -m pip install django-debug-toolbar
<mysite/settings.py>
INSTALLED_APPS = [
"django.contrib.admin",
.
.
"accounts",
"debug_toolbar",
]
MIDDLEWARE = [
.
.
"debug_toolbar.middleware.DebugToolbarMiddleware",
]
INTERNAL_IPS = [
# ...
"127.0.0.1",
# ...
]
<mysite/urls.py>
from django.conf import settings
if settings.DEBUG:
urlpatterns += [
path("__debug__/", include("debug_toolbar.urls")),
]
>python manage.py runserver

공식웹: django-environ.readthedocs.io
>python -m pip install django-environ
<.gitignore>
.env*
<mysite/settings.py - env 코드>
import environ
env = environ.Env()
env_path = BASE_DIR / ".env"
if env_path.exists():
f = env_path.open("rt", encoding="UTF8")
env.read_env(f)
<mysite/settings.py - env 상수>
SECRET_KEY = env.str(
"SECRET_KEY",
default="your original key",
)
DEBUG = env.bool("DEBUG", default=True)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", [])
if DEBUG is False:
CSRF_TRUSTED_ORIGINS = ["https://your.domain.co.kr"]
DATABASES = {
"default": env.db("DATABASE_URL", default=f"sqlite:///{BASE_DIR / 'db.sqlite3'}"),
}
INTERNAL_IPS = env.list("INTERNAL_IPS", default=["127.0.0.1"])
LANGUAGE_CODE = env.str("LANGUAGE_CODE", default="ko-kr")
TIME_ZONE = "Asia/Seoul"
USE_TZ = False
# just insert
STATIC_URL = "static/"
STATIC_ROOT = env.str("STATIC_ROOT", default=BASE_DIR / "staticfiles")
MEDIA_URL = "media/"
MEDIA_ROOT = env.str("MEDIA_ROOT", default=BASE_DIR / "mediafiles")
LOGIN_REDIRECT_URL = reverse_lazy("root")
<.env>
SECRET_KEY=mysecretkey
DEBUG=True
ALLOWED_HOSTS=yourip,your.domain.co.kr,localhost,127.0.0.1
DATABASE_URL=mysql://id:pw@127.0.0.1:3306/db_name
INTERNAL_IPS=localhost,127.0.0.1
LANGUAGE_CODE=ko-kr
-- STATIC_ROOT=
-- MEDIA_ROOT=
공식웹: django-bootstrap5.readthedocs.io
>python -m pip install django-bootstrap5
<mysite/settings.py>
INSTALLED_APPS = [
.
.
"django_bootstrap5",
]
TEMPLATES = [
"BACKEND": ...
"DIRS": [
BASE_DIR / "templates",
],
]
<mysite/urls.py>
from django.views.generic import TemplateView
urlpatterns = [
.
path("accounts/", include("accounts.urls")),
path("", TemplateView.as_view(template_name="root.html"), name="root"),
]
<templates/root.html>
{% load django_bootstrap5 %}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content=""/>
<meta name="description" content=""/>
<title>Django Test Page</title>
{% bootstrap_css %}
{$ bootstrap_javascript %}
</head>
<body>
<h1>hello</h1>
</body>
</html>

<templates/base.html>
{% load django_bootstrap5 %}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content="" />
<meta name="description" content="" />
<title>Django Test Page</title>
{% bootstrap_css %}
{% bootstrap_javascript %}
</head>
<body>
<h1>hello</h1>
{% block content %}{% endblock content %}
</body>
</html>
<templates/root.html>
{% extends "base.html" %}
{% block content %} <button class="btn btn-primary">버튼</button>{% endblock content %}
>python manage.py startapp mall
<mysite/settings.py>
INSTALLED_APPS = [
"django.contrib.admin",
.
.
.
"mall",
]
<mysite/urls.py>
from django.urls import include
urlpatterns = [
.
path("mall/", include("mall.urls")),
]
<mall/urls.py>
from django.urls import path
from . import views
urlpatterns = [
path("payment/", views.payment_new, name="payment_new"),
]
<mall/views.py>
def payment_new(request):
return render(request, "payment_form.html")
<mall/templates/base.html>
{% extends "base.html" %}
<mall/templates/payment_form.html>
{% extends "base.html" %}
{% block content %}
<h2>결재하기</h2>
{% endblock content %}