C : Create
R : Read
U : Update
D : Delete
오늘 배울 함수
- new: new.html을 보여줌
- create: new.html에서 받은 정보를 데이터베이스에 저장
new.html
만 띄워주면 된다.def new(request):
return render(request, 'new.html')
method="post"
로 설정하여 준다. (이유는 아래에서 나옴){csrf_token}
을 기입한다. (아래에서 바로 다룸)new.html
에서 입력한 값을 받아올 때 쓰이기 때문이다.<body>
<h1>Write Your Blog</h1>
<form action="" method="post">
{% csrf_token %}
<p>제목 : <input type="text" name="title" /></p>
<p>작성자 : <input type="text" name="writer" /></p>
<p>본문 : <textarea name="body" id="" cols="30" rows="10"></textarea></p>
<input type="submit" value="submit" />
</form>
</body>
templates
와 views.py
를 만들었다면, urls.py
까지 설정해주자.from django.contrib import admin
from django.urls import path
from blog.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name="home"),
path('<str:id>', detail, name="detail"),
path('new/', new, name="new"),
]
home.html
에 new.html
로 갈 링크를 하나 만들어준다.GET
POST
CSRF 공격이란?
CSRF 사용법
method="post"
를 사용할 때, 아래 {%csrf_token%}
이라는 것을 사용 해 주어야 한다.{%csrf_token%}
은 어떤 임의의 값을 의미하는데, 이게 보내지게 될 때 이걸 통해 서버는 csrf 공격이 아니라는 것을 인식하여, 공격에 대한 방지를 한다.(1) 우선, Blog 객체를 하나 생성한다.
(2) models.py
에서 생성했던 필드들에 해당하는 부분을 request.POST[field]
로 받아온다.
new.html
에서 정보를 기입할 수 있는 부분을 만들지 않았다.django.utils
모듈 내에 timezone
이라는 함수를 사용하면 따로 받지않고도 정보를 얻을 수 있기 때문이다.(3) 마지막으로 new_blog.save()
를 통해 가져온 값들을 저장할 수 있도록 하자.
(4) return 값에는 여태껏 써왔던 render
가 들어가는 것이 아닌, redirect
가 들어간다.
from django.shortcuts import redirect
를 통해 사용가능하다.from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Blog
def create(request):
new_blog = Blog() # object 생성
new_blog.title = request.POST['title'] # 필드 값 할당
new_blog.person = request.POST['writer'] # 필드 값 할당
new_blog.body = request.POST['body'] # 필드 값 할당
# pub_date는 장고에서 제공하는 모듈을 쓸 것임.
new_blog.pub_date = timezone.now()
new_blog.save()
# 어떤 화면으로 이동할 것인지 return 정해주기
# 새로운 html을 만들어서 거기에 보내려고 하는게 아니기 때문에 render는 안쓴다.
# 블로그 객체를 생성, 저장 후 원래있던 페이지로 돌아가려고 함.
# 그러기 위해서는 redirect를 쓴다.
return redirect('detail', new_blog.id)
new.html
내 form 태그의 action 속성에 들어갈 url을 만들어준다.from django.contrib import admin
from django.urls import path
from blog.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name="home"),
path('<str:id>', detail, name="detail"),
path('new/', new, name="new"),
path('create/', create, name="create"),
]
<form action="{% url 'create' %}" method="post">
` {% csrf_token %}
<p>제목 : <input type="text" name="title" /></p>
<p>작성자 : <input type="text" name="writer" /></p>
<p>본문 : <textarea name="body" id="" cols="30" rows="10"></textarea></p>
<button type="submit"></button>
</form>