- 가상환경 및 장고 설치
python -m venv myvenv (생성)
source myvenv/Scripts/activate (실행)
pip install django (설치)
- Project & App 생성
django-admin startproject project명
python manage.py startapp app명
- urls.py path 설정
from django.contrib import admin
from django.urls import path,include
import crudApp.views
urlpatterns = [
path('admin/', admin.site.urls),
path('', crudApp.views.show, name="show"),
path('crudApp/', include('crudApp.urls')),
]
- models.py class 작성
from django.db import models
# Create your models here.
class Blog(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
update_Date = models.DateTimeField(auto_now=True)
def __str(self):
return self.title
def summary(self):
return self.body[:50]
python manage.py makemigrations
python manage.py migrate
- forms.py (create / update)
from django import forms
from .models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'body']
- app/urls.py 작성
from crudApp import views
from django.urls import path
urlpatterns = [
path('create/', views.create, name="create"), # 글 작성
path('<int:blog_id>/', views.detail, name="detail"), # 상세보기
path('show/', views.show, name="show"), # 목록보기
]
- views.py
from django.shortcuts import render, get_object_or_404,redirect
from .forms import BlogForm
from .models import Blog
from django.utils import timezone
# Create your views here.
def create(request):
if request.method == "POST":
form = BlogForm(request.POST) # BlogForm 받은 데이터를 처리하기 위한 인스턴스 생성
if form.is_valid(): # form 검증 메소드
blog = form.save(commit = False) # blog 오브젝트를 form 으로부터 가져오지만, 실제 DB반영은 하지 않음
blog.update_date = timezone.now()
blog.save()
return redirect('show') # url name 경로 대신
else:
form = BlogForm() # forms.py 의 BlogForm 클래스의 인스턴스
- views.py
def detail(request, blog_id):
blog_detail = get_object_or_404(Blog, pk=blog_id)
return render(request, 'detail.html', {'blog' : blog_detail})
def show(request):
# 모든 글 대상
blogs = Blog.objects.order_by('-id') #id 반대로 / 글을 최신순으로
return render(request, 'show.html', {'blogs':blogs})
- urls.py path 추가
urlpatterns = [ ...,
path('<int:pk>/edit/', views.edit, name='edit'), # 수정
]
- views.py
def edit(request, pk):
# url-> pk 받아 처리
# 수정하고자 하는 글의 Post 모델 인스턴스를 가져온다
# 원하는 글은 pk를 이용해찾음
blog = get_object_or_404(Blog, pk=pk)
if request.method == "POST":
form = BlogForm(request.POST, instance=blog)
if form.is_valid(): # form 검증 메소드
blog = form.save(commit = False)
blog.update_date = timezone.now()
blog.save()
return redirect('show')
else:
form = BlogForm(instance = blog)
return render(request, 'edit.html' , {'form':form})
- templates
{% extends 'base.html' %}
{% block content %}
<h1>create test</h1>
<div class = 'container'>
<form method = 'POST'>
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<br>
<input class="btn bin-dark" type="submit" value="수정">
</form>
</div>
{% endblock %}
<a href="{% url 'delete' pk=blog.pk %}"> 삭제 </a>
- urls.py path 추가
urlpatterns = [ ...,
path('<int:pk>/delete/', views.delete, name='delete') # 삭제
]
- views.py
def delete(request, pk):
blog = Blog.objects.get(id=pk)
blog.delete()
return redirect('show')
Django project, app의 static 파일들(정적파일들)을 settings.py STATIC_ROOT 라는 하나의 경로로 모아주는 작업
python manage.py collectstatic
input type = hidden ?
화면상 보이진 않지만 서버쪽으로 어떤 데이터를 전송할때 사용하는 속성
예시로 회원가입 폼에서 가입경로, 날짜와 같이 굳이 사용자가 입력하지 않아도 알 수 있는 정보들을 서버로 넘길때
<input type = "hidden" name = "..." value = "서버 전송 값">