Django的强大无需赘述。用Django的最大好处是只需要写很少都代码,完成Web开发中的那些繁复的工作。增删改查,是一个web应用的典型的基本功能。Django基于模型的ClassView,可以快速实现这些功能。
一、查
####1、 ListView 实现列表页
顾名思义,ListView用来实现列表页的展示。直接上代码:
# views.py
from django.views import generic #我们需要继承的ListView在generic模块,我们导入它。
from .models import Book #导入模型,数据来源。
class BookListView(generic.ListView): #定义ListView, 继承generic.ListView
model = Book #指定模型
context_object_name = 'book_list' #定义渲染模板的context object, 默认名称为 model_name_list, 可以用context_object_name 覆盖
template_name = 'catalog/book_list.html' #模板,如不指定,默认为 model_name_list.html
paginate_by = 10 #启用分页
定义url,需要注意的是,Class View需要用as_view()方法。
#urls.py
urlpatterns = [
...
url(r'^books/$', views.BookListView.as_view(), name='books'),
]
template和用函数视图没啥区别。
<!--catalog/book_list.html-->
{% extends "catalog/base_generic.html" %}
{% block content %}
{% if book_list %}
<ul>
{% for book in book_list %}
<li>
<a href="{{ book.get_absolute_url }}">{{ book.title }}</a>({{ book.author }})
</li>
{% endfor %}
</ul>
{% else %}
<p>没有内容...</p>
{% endif %}
{% endblock %}
2、DetailView实现详细页
适用于展示单个对象的详细信息。view就一行代码!!!!只指定了model。
# views.py
class BookDetailView(generic.DetailView):
"""
默认的模板:book_detail.html
context objcet:book
"""
model = Book
url参考上面都book_list。模板如下:
{% extends "catalog/base_generic.html" %}
{% block content %}
<h1>标题:{{ book.title }}</h1>
<p><strong>作者:</strong><a href="{{ book.author.get_absolute_url }}">{{ book.author }}</a></p>
<p><strong>概要:</strong>{{ book.summary }}</p>
<p><strong>ISBN:</strong>{{ book.isbn }}</p>
<p><strong>标签:</strong>
{% for genre in book.genre.all %}
{{genre}}
{% if not forloop.last %},
{% endif %}
{% endfor %}
</p>
<div style="margin-left: 20px;margin-top: 20px">
<h4>Copies</h4>
<!--bookinstance是指该具体的实体书,和book是一对多都关系-->
{% for copy in book.bookinstance_set.all %}
<hr>
<p class="{% if copy.status == 'a' %}text-success{% elif copy.status == 'm' %}text-danger{% else %}text-warning{% endif %}">{{ copy.get_status_display }}</p>
{% if copy.status != 'a' %}<p><strong>还书日期:</strong>{{copy.due_back}}</p>{% endif %}
<p class="text-muted"><strong>Id:</strong>{{ copy.id }}</p>
{% endfor %}
</div>
{% endblock %}
二、增、改、删
增、改、删可以用django.views.generic.edit模块CreateView, UpdateView, DeleteView。可以自动处理form生成、验证等。
#views.py
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Book
# CreateView 和 UpdateView默认使用 model_name_form.html模板,如book_form.html,也可以用template_name_suffix='_other_suffix'自定义。但是,_from是必须的。所以,,不如用默认的。
class BookCreate(CreateView):
model = Book
# 权限控制。
permission_required = 'catalog.can_mark_returned'
fields = '__all__'
class BookUpdate(UpdateView):
model = Book
permission_required = 'catalog.can_mark_returned'
fields = '__all__'
# DeleteView默认使用 model_name_confirm_delete.html模板,用于确认删除。_confirm_delete之前的部分,可以template_name_suffix定义。
class BookDelete(DeleteView):
model = Book
permission_required = 'catalog.can_mark_returned'
# 删除成功后跳转链接。reverse_lazy的作用是保证删除成功才跳转。
success_url = reverse_lazy('catalog:books')
增和改用同一个模板:
<!--catalog/book_form.html-->
{% extends "catalog/base_generic.html" %}
{% block content %}
<h1>{% if book %}修改图书: {{ book }}{% else %}Create Book{% endif %}</h1>
<form action="" method="post">
<!--csrf_token,防止跨站伪造请求攻击-->
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<input type="submit" value="Submit" />
</form>
{% endblock %}
删除确认的模板:
<!--book_delete_confirm_form.html-->
{% extends "catalog/base_generic.html" %}
{% block content %}
<h1>Delete Book</h1>
<p>你确认要删除 {{ book }}吗?</p>
<form action="" method="post">
<table>
{{ form.as_table }}
<input type="submit" value="确认删除">
</table>
</form>
{% endblock %}
来源:CSDN
作者:mikezhou002
链接:https://blog.csdn.net/mikezhou002/article/details/81255881