지금까지 글을 쓸 때는 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
우리가 이동하고 싶은 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})
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
[Django] render함수 vs redirect 함수 (1) | 2020.07.12 |
---|---|
Blog project_CRUD 2-수정, 삭제 만들기 (0) | 2020.07.12 |
Blog project_pk, path converter, get_object_or_404 (0) | 2020.07.09 |
Django - Model & admin (1) | 2020.07.06 |
쟝고 기본 세팅 명령어 (1) | 2020.07.06 |
댓글