본문 바로가기

💡웹 프로젝트/(백엔드)Django - 프로젝트01

프로젝트01. 함수형 뷰에서 클래스형 뷰로 변경 & detail, update, delete구현

함수형 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