# Django 웹개발 마스터 가이드
## 학습 목표
Django로 Python 풀스택 웹 애플리케이션을 개발합니다.
## 1. Django란?
Python 기반 풀스택 웹 프레임워크입니다.
- 배터리 포함 철학
- 강력한 ORM
- 자동 관리자 페이지
- 보안 기능 내장
## 2. 프로젝트 생성
pip install django
django-admin startproject mysite
cd mysite
python manage.py runserver
앱 생성:
python manage.py startapp blog
## 3. 프로젝트 구조
mysite/
manage.py
mysite/
settings.py
urls.py
wsgi.py
blog/
models.py
views.py
urls.py
admin.py
templates/
## 4. settings.py 설정
INSTALLED_APPS에 앱 추가:
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"blog", # 추가
]
데이터베이스:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "mydb",
"USER": "root",
"PASSWORD": "password",
"HOST": "localhost",
}
}
## 5. Model
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title
class Meta:
ordering = ["-created_at"]
마이그레이션:
python manage.py makemigrations
python manage.py migrate
## 6. Admin
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ["title", "author", "created_at", "is_published"]
list_filter = ["is_published", "created_at"]
search_fields = ["title", "content"]
관리자 계정 생성:
python manage.py createsuperuser
## 7. View
함수 기반:
from django.shortcuts import render, get_object_or_404
def post_list(request):
posts = Post.objects.filter(is_published=True)
return render(request, "blog/post_list.html", {"posts": posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, "blog/post_detail.html", {"post": post})
클래스 기반:
from django.views.generic import ListView, DetailView
class PostListView(ListView):
model = Post
template_name = "blog/post_list.html"
context_object_name = "posts"
queryset = Post.objects.filter(is_published=True)
class PostDetailView(DetailView):
model = Post
template_name = "blog/post_detail.html"
## 8. URL 설정
blog/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("", views.post_list, name="post_list"),
path("<int:pk>/", views.post_detail, name="post_detail"),
]
mysite/urls.py:
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("blog/", include("blog.urls")),
]
## 9. Template
blog/templates/blog/post_list.html:
{% extends "base.html" %}
{% block content %}
<h1>Blog Posts</h1>
{% for post in posts %}
<article>
<h2><a href="{% url post_detail post.pk %}">{{ post.title }}</a></h2>
<p>{{ post.content|truncatewords:30 }}</p>
<small>{{ post.created_at|date:"Y-m-d" }}</small>
</article>
{% empty %}
<p>No posts yet.</p>
{% endfor %}
{% endblock %}
## 10. Form
from django import forms
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ["title", "content", "is_published"]
def post_create(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect("post_detail", pk=post.pk)
else:
form = PostForm()
return render(request, "blog/post_form.html", {"form": form})
## 11. 사용자 인증
로그인 필수:
from django.contrib.auth.decorators import login_required
@login_required
def post_create(request):
pass
클래스 기반:
from django.contrib.auth.mixins import LoginRequiredMixin
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ["title", "content"]
## 12. REST API (DRF)
pip install djangorestframework
from rest_framework import serializers, viewsets
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
urls.py:
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("posts", PostViewSet)
urlpatterns += router.urls
## 추천 학습 순서
1. Model과 마이그레이션
2. Admin 커스터마이징
3. View와 Template
4. Form 처리
5. REST API (DRF)