Django学习笔记:基于模型的Class View,快速实现增删改查

左心房为你撑大大i 提交于 2019-11-26 04:38:04

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 %}

阅读原文DJANGO技巧:基于模型的CLASSVIEW,快速实现增删改查

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!