五. Django的forms与ModelForm

本文介绍了如何使用 Django 的 ModelForm 进行数据增删改操作。通过具体步骤展示了 ModelForm 的创建、关联 Model 以及如何在视图中处理表单提交等内容。

在前一小节中,我们主要通过页面来显示了信息列表,那么如何在页面中进行增删改查的工作呢?在这一小节中,我们将通过页面来对现有数据进行增删改的操作。

 

1.      Forms的介绍:

我们知道通过页面向数据库中插入新的数据,一般会通过表单,而Django提供了非常完善的表单系统。

以下是Django官网对于form的介绍:

Django’s form functionality can simplify and automate vast portions of this work, and can also do it more securely than most programmers would be able to do in code they wrote themselves.

Django handles three distinct parts of the work involved in forms:

  • preparing and restructuring data to make it ready for rendering
  • creating HTML forms for the data
  • receiving and processing submitted forms and data from the client

简言之,Django会将表单的提交变得更加简单和安全,包括重构数据后在页面间传递,创建前端的HTML页面以及接收和处理客户端传来的数据。实施上,你只需要事先定义好form表单的各种属性,在前端页面简单调用即可。当然,DjangoForm提供了许多属性,方便自定义,甚至你可以重写其中的一些方法。

 

2.      ModelForm的介绍:

Form的基础上,Django还提供了一种ModelForm。如果你的FORM表单十分贴近数据Model,那么可以用ModelForm来节省大量代码。例如,如果数据模型中需要有3个字段,而且3个字段恰好都需要通过form来提交,那么使用ModelForm省时省力。同时,ModelForm也支持用户的自定义。接下来,我们就通过ModelForm来做演示。

 

3.      通过ModelForm完成三张表格的数据新增:

1)  echo目录下建立forms.py文件,今后将所有的form都写在这个文件中,这个文件需要在views.py中导入,方便导入相应的FORM

 

2)  创建ModelForm:

forms.py:

 

# -*- coding: UTF-8 -*-
from django.forms import ModelForm
from .models import Node,Line,Device

#定义Node的Form,Form名字为 模式名+Form
class NodeForm(ModelForm):
    #自定义ModelForm的内容
    class Meta:
        #该ModelForm参照Model: Node
        model = Node
        #在Form中不显示node_signer这个字段
        exclude = ['node_signer']

class LineForm(ModelForm):
    class Meta:
        model = Line
        exclude = ['line_signer']

class DeviceForm(ModelForm):
    class Meta:
        model = Device
        exclude = ['device_signer']


1)  建立urlview的关联关系:

urls.py:

url(r'^add/', echo.views.add),


4) views.py中建立相应的函数:

views.py:

# -*- coding: UTF-8 -*-
from .models import Node,Line,Device
from forms import NodeForm,LineForm,DeviceForm
from django.shortcuts import render, redirect
def add(request):
    #获取来自NodeForm的表单数据
    form = NodeForm(request.POST or None)
    #判断form是否有效
    if form.is_valid():
        #创建实例,需要做些数据处理,暂不做保存
        instance = form.save(commit=False)
        #将登录用户作为登记人
        instance.node_signer = request.user
        #保存该实例
        instance.save()
        #跳转至列表页面
        return redirect('/lists/')

    #创建context来集中处理需要传递到页面的数据
    context = {
        'form': form,
    }
    #如果没有有效提交,则仍留在原来页面
    return render(request, 'add.html',  context)


5) templates文件夹下建立HTML文件,add.html

add.html:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
 <form method='POST' action=''>{% csrf_token %}
        {{ form }}
        <input type='submit' value='提交' />
 </form>

</body>
</html>


add.html页面中,表单必须有{% csrf_token %}这个标签,否则页面无法正常提交。这是Django特意用来增加安全性,防治CSRF攻击的手段。

CSRF攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片src。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。

 

6)启动服务,访问http://127.0.0.1:8000/add,发现能够通过这个页面正常插入数据

提交后,将自动跳转至列表页面

Django框架中,`forms.Form`和`forms.ModelForm`都是用于处理表单的重要组件,但它们存在一些区别: ### 定义方式 - **`forms.Form`**:需要手动定义表单的每个字段,包括字段类型、验证规则等。例如,定义一个留言板表单类,需要明确指定标题、内容、邮箱和回复等字段的属性: ```python from django import forms class MessageBoardForm(forms.Form): title = forms.CharField(max_length=3, label='标题', min_length=2, error_messages={"min_length": '标题字符段不符合要求!'}) content = forms.CharField(widget=forms.Textarea, label='内容', error_messages={"required": 'content字段必须填写!'}) email = forms.EmailField(label='邮箱') reply = forms.BooleanField(required=False, label='回复') ``` - **`forms.ModelForm`**:基于Django的模型(Model)来定义表单,通过`Meta`类指定关联的模型和需要包含的字段。例如,关联`models.Level`模型并指定`title`和`percent`字段: ```python from django import forms import models class LevelModelForm(forms.ModelForm): class Meta: model = models.Level fields = ['title', 'percent'] ``` ### 数据交互 - **`forms.Form`**:通常用于处理模型无关的数据,或者需要自定义数据处理逻辑的场景。它不直接数据库模型交互,需要手动处理表单数据的保存和更新操作。 - **`forms.ModelForm`**:Django的模型系统无缝集成,能够自动处理表单数据数据库模型之间的交互。当表单数据验证通过后,可以直接调用`form.save()`方法将数据保存到数据库中,减少了开发人员的工作量,遵循了DRY(Don’t Repeat Yourself)原则,提高了开发效率[^3]。 ### 数据验证 - **`forms.Form`**:验证规则完全由开发人员手动定义,每个字段的验证规则需要在表单类中明确指定。 - **`forms.ModelForm`**:除了可以手动定义验证规则外,还会自动继承关联模型的字段验证规则。例如,如果模型中的某个字段设置为`unique=True`,那么在表单验证时也会检查该字段的唯一性。 ### 适用场景 - **`forms.Form`**:适用于处理非数据库相关的数据,或者需要自定义复杂数据处理逻辑的表单,如登录表单、搜索表单等。 - **`forms.ModelForm`**:适用于对单表进行增删改查操作的表单,尤其是在需要快速实现数据库模型对应的表单时,使用`ModelForm`可以大大简化开发流程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值