django 类视图
from django.urls import reverse_lazy
from django.views.generic import (TemplateView, ListView, DetailView,CreateView, UpdateView, DeleteView
)
from .models import MyModel# 1) 仅渲染模板,不依赖模型
class HomePageView(TemplateView):template_name = "myapp/base.html"# 2) 列表视图
class MyModelListView(ListView):model = MyModeltemplate_name = "myapp/object_list.html" # 指定模板context_object_name = "object_list" # 在模板中使用的上下文变量paginate_by = 10 # 如果需要分页# 3) 详情视图
class MyModelDetailView(DetailView):model = MyModeltemplate_name = "myapp/object_detail.html"context_object_name = "object"# 4) 新建视图
class MyModelCreateView(CreateView):model = MyModelfields = ["title", "content"] # 自动生成表单字段template_name = "myapp/object_form.html"success_url = reverse_lazy("myapp:list") # 成功后跳转# 5) 更新视图
class MyModelUpdateView(UpdateView):model = MyModelfields = ["title", "content"]template_name = "myapp/object_form.html"success_url = reverse_lazy("myapp:list")# 6) 删除视图
class MyModelDeleteView(DeleteView):model = MyModeltemplate_name = "myapp/object_confirm_delete.html"success_url = reverse_lazy("myapp:list")
路由配置
from django.urls import path
from .views import (HomePageView, MyModelListView, MyModelDetailView,MyModelCreateView, MyModelUpdateView, MyModelDeleteView
)app_name = "myapp"urlpatterns = [path("", HomePageView.as_view(), name="home"),path("objects/", MyModelListView.as_view(), name="list"),path("objects/add/", MyModelCreateView.as_view(), name="add"),path("objects/<int:pk>/", MyModelDetailView.as_view(), name="detail"),path("objects/<int:pk>/edit/", MyModelUpdateView.as_view(), name="edit"),path("objects/<int:pk>/delete/", MyModelDeleteView.as_view(), name="delete"),
]
base.html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>{% block title %}MyApp{% endblock %}</title><link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body><nav><a href="{% url 'myapp:home' %}">首页</a> |<a href="{% url 'myapp:list' %}">列表</a> |<a href="{% url 'myapp:add' %}">新建</a></nav><hr><div class="container">{% block content %}{% endblock %}</div>
</body>
</html>
列表页(object_list.html)
{% extends "myapp/base.html" %}
{% block title %}对象列表{% endblock %}{% block content %}<h1>对象列表</h1><ul>{% for obj in object_list %}<li><a href="{% url 'myapp:detail' obj.pk %}">{{ obj.title }}</a>— {{ obj.created_at|date:"Y-m-d H:i" }}</li>{% empty %}<li>暂无数据</li>{% endfor %}</ul>{# 分页导航 #}{% if is_paginated %}<div class="pagination">{% if page_obj.has_previous %}<a href="?page={{ page_obj.previous_page_number }}">« 上一页</a>{% endif %}<span>第 {{ page_obj.number }} 页,共 {{ page_obj.paginator.num_pages }} 页</span>{% if page_obj.has_next %}<a href="?page={{ page_obj.next_page_number }}">下一页 »</a>{% endif %}</div>{% endif %}
{% endblock %}
详情页(object_detail.html)
{% extends "myapp/base.html" %}
{% block title %}对象详情{% endblock %}{% block content %}<h1>{{ object.title }}</h1><p>{{ object.content }}</p><p><small>创建于:{{ object.created_at|date:"Y-m-d H:i" }}</small></p><p><a href="{% url 'myapp:edit' object.pk %}">编辑</a> |<a href="{% url 'myapp:delete' object.pk %}">删除</a> |<a href="{% url 'myapp:list' %}">返回列表</a></p>
{% endblock %}
表单页(object_form.html)
{% extends "myapp/base.html" %}
{% block title %}{{ view.action }} 对象{% endblock %}
{% block content %}<h1>{{ view.action }} 对象</h1><form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit">{{ view.action }}</button></form><a href="{% url 'myapp:list' %}">取消</a>
{% endblock %}