Diango 第五章 探究CBV视图

Django植入视图功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发,这种以类的形式实现响应与请求处理成为CBV(Class Base Views)

1. 数据显示视图

数据显示视图是将后台的数据展示在网页上,数据主要来自模型,一共定义了4个视图类,分别是 RedirectView、TemplateView、ListView 和 DetailView,说明如下:

  • RedirectView 用于实现HTTP 重定向,默认情况下只定义GET请求的处理方法。
  • TemplateView 是视图类的基础视图,可将数据传递给 HTML 模板,默认情况下只定义GET
    请求的处理方法。
  • ListView 是在 TemplateView的基础上将数据以列表显示,通常将某个数据表的数据以列表表
    示。
  • DetailView 是在 TemplateView 的基础上将数据详细显示,通常获取数据表的单条数据。

1.1 重定向视图RedirectView

对视图类RedirectView进行重写

#My urls.py
urlpatterns = [
    # 定义路由
    path('', index, name='index'),
    path('trunTo', trunTo.as_view(), name='trunTo')
]

#My views.py
def index(request):
    return render(request, 'index.html')

class trunTo(RedirectView):
    permanent = False
    url = None
    pattern_name = 'My:index'
    query_string = True

    def get_redirect_url(self, *args, **kwargs):
        print('This is get_redirect_url')
        return super().get_redirect_url(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        print(request.META.get('HTTP_USER_AGENT'))
        return super().get(request, *args, **kwargs)

#teplates index.html

<!DOCTYPE html>
<html>
<body>
<h3>Hello RedirectView</h3>
<a href="{% url 'My:trunTo' %}?k=1">ToTurn</a>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

1.2 基础视图TemplateView

视图类TemplateView是所有视图类里最基础的应用视图类

#My urls.py
urlpatterns = [
    # 定义路由
    path('', index.as_view(), name='index'),
]
#My view.py
class index(TemplateView):
    template_name = 'index.html'
    template_engine = None
    content_type = None
    extra_context = {'title': 'This is GET'}

    # 重新定义模版上下文的获取方式
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['value'] = 'I am MyDjango'
        return context

    # 定义HTTP的POST请求处理
    def post(self, request, *args, **kwargs):
        self.extra_context = {'title': 'This is POST'}
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)
#index.html 
<!DOCTYPE html>
<html>
<body>
<h3>Hello,{{ title }}</h3>
<div>{{ value }}</div>
<br>
<form action="" method="post">
    {% csrf_token %}
    <input type="submit" value="Submit">
</form>
</body>
</html>

在这里插入图片描述在这里插入图片描述

1.3列表视图ListView

将数据表以列表的形式显示,常用于数据的查询和展示。

#在My的models.py
from django.db import models

class PersonInfo(models.Model):
    id = models.AutoField(primary_key = True)
    name = models.CharField(max_length=20)
    age = models.ImageField()

上面只搭建PersonInfo类和数据表personinfo的映射关系,但在数据库中并没有生成。数据库以SQLite3为例,在terminal中文件下,依次输入迁移指令

python manage.py makemigrations

python manage.py migrate

完成后看到
在这里插入图片描述
在My_personinfo中填入
在这里插入图片描述
在index.html中

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
<body>
    <h3>{{ title }}</h3>
    <table border="1">
      {% for i in personinfo_list %}
          <tr>
            <th>{{ i.name }}</th>
            <th>{{ i.age }}</th>
          </tr>
      {% endfor %}
    </table>
    <br>
    {% if is_paginated %}
    <div class="pagination">
        <span class="page-links">
            {% if page_obj.has_previous %}
                <a href="/?page={{ page_obj.previous_page_number }}">上一页</a>
            {% endif %}
            {% if page_obj.has_next %}
                <a href="/?page={{ page_obj.next_page_number }}">下一页</a>
            {% endif %}
            <br>
            <br>
            <span class="page-current">{{ page_obj.number }}页,共{{ page_obj.paginator.num_pages }}页。
            </span>
        </span>
    </div>
    {% endif %}
</body>
</html>

在这里插入图片描述在这里插入图片描述

1.4 详细试图DetailView

将数据库的某一条数据详细显示在网页上。

2 数据操作视图

数据操作视图是对模型进行操作,如增、删、改,从而实现Django与数据库的数据父。数据操作视图有4个视图类,分别是
FormView、CreateView、UpdateView 和 DeleteView,说明如下:

  • FormView 视图类使用内置的表单功能,通过表单实现数据验证、响应输出等功能,用于显 示表单数据。
  • CreateView 实现模型的数据新增功能,通过内置的表单功能实现数据新增。
  • UpdateView 实现模型的数据修改功能,通过内置的表单功能实现数据修改。
  • DeleteView 实现模型的数据删除功能,通过内置的表单功能实现数据删除。

2.1 表单视图

视图类表单是表单在视图里的一种使用方式,表单时搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入数据信息,然后提交到网站服务器端进行处理,如数据录入
注册等。
在APP应用下创建form.py文件


```bash
#form.py文件
from django import forms
from My.models import PersonInfo

class PersonInfoForm(forms.ModelForm):
    class Meta:
        model = PersonInfo
        fields = '__all__'
        
#urls.py
urlpatterns = [
    path('', index.as_view(), name='index'),
    path('result',result, name = 'result')
]

#views.py
def result(request):
    return HttpResponse('Success')
class index(FormView):
    initial = {'name':'妹妹','age': 11}
    template_name = 'index.html'
    success_url = '/result'
    form_class = PersonInfoForm
    extra_context = {'title':'人员信息表'}
#index.html
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
<body>
    <h3>{{ title }}</h3>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="确定">
    </form>
</body>
</html>

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200526195245934.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200526195304741.png)
 ## 2.2新增试图CreateView
 在视图类FormView的基础上加入数据新增的功能
 在上面的项目中修改views.py
 

```bash
def result(request):
    return HttpResponse('Success')
class index(CreateView):
    initial = {'name':'妹妹','age': 11}
    template_name = 'index.html'
    success_url = '/result'
    form_class = PersonInfoForm
    model = PersonInfo
    fileds = ['name','age']
    extra_context = {'title':'人员信息表'}

在这里插入图片描述

2.3 修改视图UpdateView

#urls.py
urlpatterns = [
    path('<age>.html', index.as_view(), name='index'),
    path('result',result, name = 'result')
]

#views.py
def result(request):
    return HttpResponse('Success')
class index(UpdateView):
    initial = {'name':'妹妹','age': 11}
    template_name = 'index.html'
    success_url = '/result'
    form_class = PersonInfoForm
    model = PersonInfo
    fileds = ['name','age']
    slug_url_kwarg = 'age'
    slug_field = 'age'
    context_object_name = 'personinfo'
    extra_context = {'title':'人员信息表'}
    
#index.html
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
<body>
    <h3>{{ title }}-{{ personinfo.name }}</h3>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="确定">
    </form>
</body>
</html>

访问127.0.0.1:8000/11.html
在这里插入图片描述

2.4删除视图DeleteView

#urls.py
urlpatterns = [
    path('<pk>.html', index.as_view(), name='index'),
    path('result',result, name = 'result')
]

#views.py
def result(request):
    return HttpResponse('Success')
class index(DeleteView):
    template_name = 'index.html'
    success_url = '/result'
    model = PersonInfo
    context_object_name = 'personinfo'
    extra_context = {'title':'人员信息表'}
    
#index.html
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
<body>
    <h3>{{ title }}-{{ personinfo.name }}</h3>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <div>
            删除{{ personinfo.name }}?
        </div>
        <input type="submit" value="确定">
    </form>
</body>
</html>

在这里插入图片描述在这里插入图片描述

3.日期筛选试图

日期筛选视图是根据模型里的某个日期字段进行数据筛选,然后将符合结果的数据以一定的形式显示在网页上。简单来说,就是在列表视图ListView或详细视图 DetailView 的基础上增加日期筛选所实现的视图类。它一共定义了7个日期视图类,其说明如下:

  • ArchiveIndex View是将数据表所有的数据以某个日期字段的降序方式进行排序显示。
  • YearArchiveView 是在数据表筛选某个日期字段某年的所有数据,并默认以升序的方式排序显 示,年份的筛选范围由路由变量提供。
  • MonthArchiveView 是在数据表筛选某个日期字段某年某月的所有数据,并默认以升序的方式 排序显示,年份和月份的筛选范围都是由路由变量提供的。
  • WeekArchiveView 是在数据表筛选某个日期字段某年某周的所有数据,总周数是将一年的总 天数除以7所得的,数据默认以升序的方式排序显示,年份和周数的筛选范围都是由路由变 量提供的。
  • DayArchiveView 是对数据表的某个日期字段精准筛选到某年某月某天,将符合条件的数据以 升序的方式排序显示,年份、月份和天数都是由路由变量提供的。
  • TodayArchiveView 是在视图类 DayArchiveView 的基础上进行封装处理,它将数据表某个日期字段的筛选条件设为当天时间,符合条件的数据以升序的方式排序显示。
  • DateDetailView 用于查询某年某月某日某条数据的详细信息,它在视图类 DetailView 的基础 上增加日期筛选功能,筛选条件主要有年份、月份、天数和某个模型字段,其中某个模型字 段必须具有唯一性,才能确保查询的数据具有唯一性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值