Django 제네릭 클래스형 뷰 (CBV)

Tae Woo Kim·2024년 8월 20일

Python

목록 보기
5/7

0. url 설정

밑 4가지 뷰를 위한 url endpoint 설정

# urls.py
from django.urls import path

from . import views

app_name = 'todo'
urlpatterns = [
    path('vonly/', views.TodoVueOnlyTV.as_view(), name='vonly'),
    path('create/', views.TodoCV.as_view(), name='create'),
    path('list/', views.TodoLV.as_view(), name='list'),
    path('<int:pk>/delete/', views.TodoDelV.as_view(), name='delete'), 
]

1. TemplateView

주어진 Template을 렌더링 하는 기능
예시:

# views.py
class TodoVueOnlyTV(TemplateView): 
  template_name = 'todo/todo_vue_only.html'

2. CreateView

새로운 데이터 생성을 위한 뷰
예시:

# views.py
class TodoCV(CreateView):
  model = Todo
  fields = '__all__'
  template_name = 'todo/todo_form.html'
  success_url = reverse_lazy('todo:list')

3. ListView

데이터 리스트를 보여주기 위한 뷰
예시:

# views.py
class TodoLV(ListView):
  model = Todo
  template_name = 'todo/todo_list.html'

4. DeleteView

데이터 삭제를 위한 뷰
예시:

# views.py 
class TodoDelV(DeleteView):
  model = Todo
  template_name = 'todo/todo_confirm_delete.html'
  success_url = reverse_lazy('todo:list')

5. templates

<!-- todo_list.html -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue-Django Todo App</title>
</head>

<body>
  <div id="app">
    <h1>My Todo App</h1>
    <strong>서로 할 일이나 의견을 공유해 봅시다.</strong>
    <br>

    <ul class="todoList">
      {% for todo in object_list %}
      <li>
        <span>{{ todo.name }}:: {{ todo.todo }}</span>
        <span class="removeBtn"><a href="{% url 'todo:delete' todo.id %}">&#x00D7</a></span>
      </li>
      {% endfor %}
    </ul>
  </div>
</body>

</html>
<!-- todo_form.html -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue-Django Todo App</title>
</head>

<body>
  <div id="app">
    <h1>My Todo App</h1>
    <strong>서로 할 일이나 의견을 공유해 봅시다.</strong>
    <br>

    <form class="inputBox" action="." method="post"> {% csrf_token %}
      <input type="text" class="name" placeholder="name ..." name="name">
      <input type="text" class="item" placeholder="type anything ..." name="todo">
      <button>ADD</button>
    </form>
  </div>
</body>
</html>
<!-- todo_confirm_delete.html -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue-Django Todo App</title>
</head>

<body>
  <div id="app">
    <h1>Todo delete</h1>
    <p>Are you sure to delete {{ object }} ?</p>
    <br>

    <form action="." method="post"> {% csrf_token %} 
      <button type="submit">Confirm</button>
    </form>
  </div>
</body>

</html>

0개의 댓글