欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Diango 第五章 探究CBV视图

程序员文章站 2022-06-02 16:14:26
...

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>

Diango 第五章 探究CBV视图
Diango 第五章 探究CBV视图

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>

Diango 第五章 探究CBV视图Diango 第五章 探究CBV视图

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

完成后看到
Diango 第五章 探究CBV视图
在My_personinfo中填入
Diango 第五章 探究CBV视图
在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>

Diango 第五章 探究CBV视图Diango 第五章 探究CBV视图

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':'人员信息表'}

Diango 第五章 探究CBV视图

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
Diango 第五章 探究CBV视图

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>

Diango 第五章 探究CBV视图Diango 第五章 探究CBV视图

3.日期筛选试图

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

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