함수형 view를 클래스형 view(generic view 상속)로 변경해보고,
memolist화면에서 detail, update, delete기능을 구현해보겠습니다.
- Detail기능 : memolist에서 글의 제목 클릭하면 글의 title, content 출력
- Update기능 : memolist에서 모든글 옆에 update클릭하면 수정할 수 있는 form 생성
- Delete기능 : memolist에서 모든글 옆에 delete클릭하면 삭제하는 confirm_delete페이지 나타나고 delete클릭하면 삭제
목차
- 1. views.py 변경, 제네릭 뷰 상속받기
- 2. urls.py 변경
- 3. template 변경
- 4. 결과
<FBV에서 CBV로 변경 + detail, update, delete구현>
1. views.py 변경, 제네릭 뷰 상속받기
FBV |
CBV |
create |
CreatememoView(CreateView) |
memolist |
MemolistView(ListView) |
update |
UpdatememoView(UpdateView) |
delete |
DeletememoView(DeleteView) |
MemodetailView(DetailView) |
|
page, memo |
page, memo |
from django.shortcuts import render
from django.views import generic
from django.views.generic import ListView #추가
from django.views.generic.edit import CreateView, UpdateView, DeleteView #추가
from django.views.generic import DetailView #추가
from django.urls import reverse_lazy #추가
from .models import Entries
class CreatememoView(CreateView): #글 생성하는 뷰
model = Entries
fields = ['title', 'content']
success_url = reverse_lazy('memolist')
template_name_suffix = '_create'
class MemolistView(ListView): #글 목록 뷰
model = Entries
class MemodetailView(DetailView): #각각의 글의 내용을 볼 수 있는 뷰
model = Entries
class UpdatememoView(UpdateView): #글 수정하는 뷰
model = Entries
fields = ['title','content']
template_name_suffix= '_update'
class DeletememoView(DeleteView): #글 삭제하는 뷰
model = Entries
#fields = '__all__'
success_url = reverse_lazy('memolist')
def page(request):
return render(request, 'simp_web/page.html', {})
def memo(request):
return render(request, 'simp_web/memo.html', {})
2. urls.py 변경
- detail, update, delete의 url추가
from django.contrib import admin
from simp_web import views
from django.conf.urls import include, url
from simp_web.views import CreatememoView, MemolistView, MemodetailView, UpdatememoView, DeletememoView #추가
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
#path('simp_web/', include('simp_web.urls')),
path('simp_web/page', views.page, name='page'),
path('simp_web/page/memo', views.memo, name='memo'),
path('simp_web/page/memo/create', CreatememoView.as_view(), name='add'),
path('simp_web/page/memo/memolist', MemolistView.as_view(), name='memolist'),
path('simp_web/page/memo/memolist/detail/<int:pk>', MemodetailView.as_view(), name='detail'), #detail
path('simp_web/page/memo/memolist/update/<int:pk>', UpdatememoView.as_view(), name='update'), #update
path('simp_web/page/memo/memolist/delete/<int:pk>', DeletememoView.as_view(), name='delete'), #delete
]
3. template 변경
- create, list 템플릿 변경
- update, delete, detail 템플릿 생성
- page.html, memo.html, base.html은 변경사항 없음.
3-1) create.html -> entries_create.html로 변경
{% extends 'simp_web/base.html' %}
{% block title %}create memo{% endblock %}
{% block content %}
<p>
<a href="{% url 'memolist' %}">Goto Lista>
p>
<form action="" method="post">
<h2>메모 작성h2>
{% csrf_token %}
{{form.as_p}}
<div>
<input type="submit" value="Add" class="btn btn-info btn-sm" name="save">create newbutton>
div>
form>
{% endblock %}
3-2) memolist.html -> entries_list.html로 변경
{% extends 'simp_web/base.html' %}
{% block title %}memolist{% endblock %}
{% block content %}
<table class="table">
<thead>
<tr>
<th scope = "col">#th>
<th scope = "col">titleth>
<th scope = "col">contentth>
<th scope = "col">updateth>
<th scope = "col">deleteth>
tr>
thead>
<tbody>
{% for Entries in object_list %}
<tr>
<td>{{forloop.counter}}td>
<td><a href="{% url 'detail' pk=Entries.id %}">{{Entries.title}}a>td>
<td>{{Entries.content}}td>
<td><a href="{% url 'update' pk=Entries.id %}" class="btn btn-success btn-sm">updatea>td>
<td><a href="{% url 'delete' pk=Entries.id %}" class="btn btn-danger btn-sm">deletea>td>
tr>
{% endfor %}
tbody>
table>
<li><a href="http://127.0.0.1:8000/simp_web/page/memo">메모 카테고리로 이동a>li>
{% endblock %}
3-3) update.html -> entries_update.html 생성
{% extends 'simp_web/base.html' %}
{% block title %}update memo{% endblock %}
{% block content %}
<p>
<a href="{% url 'memolist' %}">Goto Lista>
p>
<form action="" method="post">
<h2>메모 작성h2>
{% csrf_token %}
{{form.as_p}}
<div>
<input type="submit" value="Add" class="btn btn-info btn-sm" name="save">create newbutton>
div>
form>
{% endblock %}
3-4) delete.html -> entries_confirm_delete.html 생성
<html lang="ko">
<head>
<meta charset="utf-8">
<title>{% block title %}delete memo{% endblock %}title>
head>
<body>
<form method="post">
{% csrf_token %}
<div class="alert alert-danger">{{object}} delete?div>
<input type="submit" class="btn btn-info btn-sm" value="delete">
form>
body>
html>
3-5) entries_detail.html 생성
{% extends 'simp_web/base.html' %}
{% block title %}memo detail{% endblock %}
{% block content %}
title : {{object.title}}
<br><br>
content : {{object.content}}
{% endblock %}
4. 결과
4-1) memolist
4-2) detail
4-3) update
4-4) confirm_delete
'💡웹 프로젝트 > (백엔드)Django - 프로젝트01' 카테고리의 다른 글
프로젝트01. Django authentication를 활용한 회원가입, 로그인, 로그아웃 구현 (0) | 2019.12.13 |
---|---|
프로젝트01. bootstrap 적용하기 (0) | 2019.12.11 |
클래스형 view (0) | 2019.12.09 |
프로젝트01. admin 사이트에 model class 등록하기 (0) | 2019.12.09 |
프로젝트01. base.html설정 & modelform 생성 (0) | 2019.12.08 |