Django全栈开发学习笔记(六)——数据操作视图:增、改、删

视图基础知识3

1数据操作视图

数据操作视图是对数据模型进行操作,如增、删、改,从而实现Django与数据库的数据交互。一共有4种视图类分别是FormView、CreateView、UpdateView和DeleteView。

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

1.1表单视图FormView

视图类FormView的底层是由TemplateResponseMixin、ContextMixin和View组成。其具有视图类TemplateView的所有属性和方法,同时还新增了:

  • initial:由FormMixin定义,设置表单初始化的数据
  • form_class:由FormMixin定义,设置表单类
  • success_url:由FormMixin定义,设置重定向的路由地址
  • prefix:由FormMixin定义,设置表单前缀(即表单在模板的上下文),可在模板里生成表格数据
  • get_initial():由FormMixin定义,获取表单初始化的数据
  • get_prefix():由FormMixin定义,获取表单的前缀
  • get_form_class():由FormMixin定义,获取表单类
  • get_form():由FormMixin定义,调用get_form_kwargs()完成表单类的实例化
  • get_form_kwargs():由FormMixin定义,执行表单类实例化过程
  • get_success_url():由FormMixin定义,获取重定向路由地址
  • form_valid():由FormMixin定义,表单有效将会重定向到指定的路由地址
  • form_invalid():由FormMixin定义,表单无效将返回空白表单
  • get_context_data():由FormMixin定义,获取模板上下文的数据内容
  • get():有ProcessFormView定义,定义HTTP的GET请求的处理方法
  • post():有ProcessFormView定义,定义HTTP的POST请求的处理方法

示例代码:
app的form.py

from django import forms
from .models import PersonInfo
class PersonInfoForm(forms.ModelForm):
    class Meta:
        model = PersonInfo
        fields = '__all__'

app的urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path('', index.as_view(), name='index'),
    path('result', result, name='result')
]

app的views.py

from django.views.generic.edit import FormView
from .form import PersonInfoForm
from django.http import HttpResponse

def result(request):
    return HttpResponse('Success')

class index(FormView):
    initial = {'name': 'Betty', 'age': 20}
    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>

1.2新增视图CreateView

视图类CreateView是对模型新增数据的视图类,是在表单视图类FormView的基础上加以封装的。其底层依旧是基于TemplateResponseMixin、ContextMixin和View组成,整个设计共继承8个类,同样在这三个类基础上,还新增重写了一些属性和方法:

  • fields:由ModelFormMixin定义,设置模型字段,以列表表示,每个字段代表一个列表元素可生成表单的数据列表,为用户提供数据输入。
  • get_form_class():由ModelFormMixin定义,重写FormMixin方法,根据属性fields和form_class的组合情况进行判断,从而选择表单的生成方式。
  • get_form_kwargs():由ModelFormMixin定义,重写FormMixin方法
  • get_success_url():由ModelFormMixin定义,重写FormMixin方法,判断属性success_url是否为空,若为空,则从模型的内置方法get_absolute_url()获取重定向的路由地址
  • form_valid():由ModelFormMixin定义,重写FormMixin的表单验证方法,新增表单数据保存到数据库的功能。
  • template_name_suffix:由CreateView定义,设置模板的后缀名,用于设置默认的模板文件。

视图类CreateView虽然具备TemplateView、SingleObjectMixin和FormView的所有属性和方法,但运行方式有些变化,其中最大特点在于get_form_class()方法,它是通过判断属性form_class(来自FormMixin类)、fields(来自ModelFormMixin类)和model(来自SingleObjectMixin类),从而实现数据新增操作。
判断方法如下:

  • 若fields和form_class都不等于None,则抛出异常,提示不允许同时设置fields和form_class。
  • 若form_class不等于None且fields等于None,则返回form_class。
  • 若form_class等于None,则从属性model、object和get_queryset()获取模型对象。同时判断属性fields是否为None,若为None则抛出异常;若不为None,则根据属性fields生成表单对象,由表内置的modelform_factory()方法实现。

整体来说CreateView视图类有两种表单生成方式:

  1. 设置属性form_class,通过属性form_class指定表单对象,如果自定义的表单和模型的字段不相符,容易出现异常。
  2. 设置属性model和fields,由模型对象和模型字段来生成相应的表单对象,生成的表单字段与模型的字段相符,可以减少异常。

代码示例:
views.py(其余的代码沿用之间的)

from django.views.generic.edit import CreateView
from .form import PersonInfoForm
from .models import PersonInfo
from django.http import HttpResponse

def result(request):
    return HttpResponse('Success')

class index(CreateView):
    initial = {'name': 'Betty', 'age': 20}
    template_name = 'index.html'
    success_url = '/result'
    # 表单生成方式一
    # form_class = PersonInfoForm
    # 表单生成方式二
    model = PersonInfo
    # fields设置模型字段,从而生成表单字段
    fields = ['name', 'age']
    extra_context = {'title': '人员信息表'}

1.3修改视图UpdateView

视图类UpdateView是在视图类FormView和DetailVIew的基础上实现的,它首先使用视图类DetailView的功能(SingleObjectMixin)通过路由变量查询数据表某条数据并显示在网页上,然后在视图类FormView的基础上通过表单方式实现数据修改。
代码示例:
app的urls.py

from django.urls import path
from .views import *

urlpatterns = [
    # 定义路由
    path('.html', index.as_view(), name='index'),
    path('result', result, name='result')
]

app的views.py

from django.views.generic.edit import UpdateView
from .models import PersonInfo
from django.http import HttpResponse

def result(request):
    return HttpResponse('Success')

class index(UpdateView):
    template_name = 'index.html'
    success_url = '/result'
    model = PersonInfo
    # fields设置模型字段,从而生成表单字段
    fields = ['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>

1.4删除视图DeleteView

视图类DeleteView只能删除单条数据,路由变量为模型主键提供查询范围,查询出来的数据通过POST请求实现删除,删除过程有DeleteMixin的delete()方法完成。
代码示例:
app的urls.py

from django.urls import path
from .views import *

urlpatterns = [
    # 定义路由
    path('.html', index.as_view(), name='index'),
    path('result', result, name='result')
]

app的views.py

from django.views.generic.edit import DeleteView
from .models import PersonInfo
from django.http import HttpResponse

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

HTML文件

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
<body>
    <h3>{{ title }}-{{ personinfo.name }}</h3>
    <form method="post">
        {% csrf_token %}
        <div>删除{{ personinfo.name }}</div>
        <input type="submit" value="确定">
    </form>
</body>
</html>

你可能感兴趣的:(Django学习,python,django)