본문 바로가기
개발/Django_python 웹 프레임워크

Blog project_Create 글쓰기 만들기/CRUD

by 자유로운 코끼리 2020. 7. 12.
728x90

지금까지 글을 쓸 때는 url에 직접 admin을 입력하여 사용했었습니다.

하지만 실제로 글을 쓸 때는 글쓰기 페이지에서 만들곤 하잖아요?

이제 글을 작성하는 페이지를 만들어보겠습니다.

 

1. 글쓰기 페이지 만들기

new.html로 만들겠습니다.

<form action="">
	<h4>제목: </h4>
	<input type="text" name="title">
	<br>
	<h4>본문: </h4>
	<textarea cols=40 rows=10 name="body"></textarea>
	<br>
	<input type="submit" value="제출하기">
</form>

#views.py

def new(request):
    return render(request, '/new.html')

#urls.py

path('new/', blog.views.new, name='new')

2. 입력한 데이터 DB에 저장하기

이제 new.html에서 입력된 값을 db에 저장하는 함수를 만들어줘야 하는데요.

create 함수를 만든다고 생각해봅시다.

 

우선 new.html에 url 연결부터 해줄께요.

 

#new.html

<form action="{% url 'create' %}">

#urls.py

path('create/', blog.views.create, name='create')

이때 create.html없이 url만 만들어도 되느냐,

path를 추가한다고 무조건 html을 만들 필요는 없습니다.

path는 html에 create요청이 들어왔을 때, views.py의 create 함수를 호출하라는 의미이기 때문입니다.

 

#views.py

이제 대망의(?) create 함수를 만들어보겠습니다. 

우리는 input으로 들어오는 값 받아 db에 담아주면 되는데,

wordcount에서 값을 받은 형식을 그대로 가져오면 됩니다.

form은 기본적으로 get method를 이용하여 정보를 보내니,

request.GET 으로 정보를 요청한 거, 기억나시죠?:>.

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone

def create(request):
    blog = Blog()
    blog.title = request.GET['title']
    blog.body = request.GET['body']
    blog.pub_date = timezone.datetime.now()
    blog.save()
    return redirect('/detail/' + str(blog.id))

우선 Blog라는 클래스에서 blog라는 객체를 생성해줍니다.

그리고 이 객체에 변수의 값을 채워주는거죠. 

이때 main에서 title이라는 이름을 가진 값을 request.GET 으로 가져와 blog.title에 넣어주는 겁니다.

 

blog.pub_date같은 경우는 timezone 함수를 이용하여 블로그를 작성하는 그 시점의 시간을 넣어줍니다.

이를 이용하기 위해 import해줘야겠죠?

 

그리고 blog.save()를 이용해 blog객체에 여태 넣은 값을 db에 넣어줍니다.

참고로 blog.delete()를 이용하면 넣은 값을 지워줄 수도 있습니다.

 

이제 이렇게 한 후 return을 했을 때,

우리는 방금 쓴 글의 상세페이지를 띄우는 코드를 짜려고 합니다.

이를 위해 redirect함수를 이용해볼건데요.

redirect함수는 redirect(URL)의 형태로 "요청을 들어오면 괄호 안의 URL로 이동하는" 함수입니다.

render함수와의 차이점은 다음 블로그를 참고해주세요.

https://free-eunb.tistory.com/38

 

[Django] render함수 vs redirect 함수

render render(request, template_name, context=None, content_type=None, status=None, using=None) render는 django.shortcuts 패키지에 있는 함수로서 다음과 같은 파라미터를 가집니다. 이때 request와 templ..

free-eunb.tistory.com

우리가 이동하고 싶은 url은 방금 전 만들어진 blog 객체의 id 값에 해당하는 detail.html입니다.

이때 ('/detail/' + str(blog.id))에서 blog.id를 string으로 씌워준 이유는 url은 항상 string이기 때문입니다.

 

이를 끝내고 나면 짠~~~~~

완성입니다:>!'

3. (추가) new, create 함수 하나로 합치기

new, create 함수의 기능을 나누어 따로했지만,

사실 같이 사용할수도 있습니다.

def new(request):
    if request.method=="POST":
        blog = Blog()
        blog.title = request.POST['title']
        blog.body = request.POST['body']
        blog.pub_date = timezone.datetime.now()
        blog.save()
        return redirect('/detail/' + str(blog.id))   
    else:    
        return render(request,'new.html') 

 

번외) 최신글 순위로 보이게 하기

order_by() 함수를 이용해서, 괄호 안에 값을 기준으로 정렬 가능합니다.

ex) order_by('title') 등등

def main(request):
    blogs = Blog.objects.all().order_by('-id') #모델로부터 객체의 목록을 전달, 쿼리셋
    return render(request, 'main.html', {'blogcontent': blogs})

댓글