十二、Django表单

news/2024/4/20 8:08:45/文章来源:https://blog.csdn.net/Sean_0819/article/details/129144712

表单

在之前的案例中,每次我们需要提交表单数据的时候。我们都需要去手动编辑html表单,根据不同的字段,字段名,进行编码。做了很多重复的部分,所以django提供了一个专门用来处理表单的类,django.forms.Form

通过它,我们不仅能够自动生成前端页面,也可以用来验证数据的合法性。我们通过改写添加修改学生的表单来学习它。

创建表单

在app根目录下,创建一个forms.py的模块,代码如下:

from django import forms
from .models import Channelclass StudentForm(forms.Form):name = forms.CharField(label='姓名', max_length=20)age = forms.IntegerField(label='年龄', required=False)sex = forms.ChoiceField(label='性别', choices=((1, '男'), (0, '女')))phone = forms.CharField(label='手机号码', required=False, max_length=20)channel = forms.ModelChoiceField(label='渠道', required=False, queryset=Channel.objects.all())

每一个模型表单,都是forms.Form的一个子类,类属性与模型的类属性类似,都表示不同类型的字段。不同的字段,将会渲染成不同的input类型。字段名与每一个input标签的name属性对应。

每一个字段都是一个字段类的实例,其中label参数渲染成label标签的内容。max_length用来限制用户输入字符长度。required参数表示该字段是否必填,默认为True,要指定一个字段是不必填的,设置required=False

在模板中使用表单

只需要讲表单实例放到模板上下文就可以通过模板变量使用表单。

渲染表单对象

修改学生添加页面视图如下:

from .forms import StudentFormclass StudentCreateView(View):"""学生添加视图"""def get(self, request):"""学生添加页面"""# 1. 获取渠道对象channels = Channel.objects.all()form = StudentForm()return render(request, 'crm/student_detail.html', context={'channels': channels, 'form': form})

在视图中,实例化了一个表单对象,然后传递变量form给了模板。那么在模板中通过{{ form }}将会渲染对应的<label><input>元素,下面是StduentForm实例用{{from}}的输出:

<tr><th><label for="id_name">姓名:</label></th><td><input type="text" name="name" maxlength="20" required id="id_name"></td></tr>
<tr><th><label for="id_age">年龄:</label></th><td><input type="number" name="age" id="id_age"></td></tr>
<tr><th><label for="id_sex">性别:</label></th><td><select name="sex" id="id_sex"><option value="1">男</option><option value="0">女</option><option value="1">百度</option><option value="2">抖音</option><option value="3">b站</option>
</select></td></tr>

我们看到表单对象默认渲染了表格格式的字段,所以记住需要在模板中提供外层<form>标签和submit控件。

那么在模板中可以安装如下方式渲染:

<form ><talbe>{{ form }}</talbe><input type="submit" value="添加" />
</form>    

对于表单字段的渲染,还有如下格式:

  • {{ form.as_table }} 字段会渲染成表格元素<tr>
  • {{ form.as_p }} 字段会渲染成<p>标签
  • {{ form.as_ul }} 字段会渲染成<li>标签

注意记得提供外层的<table><ul>元素

手动渲染字段

直接渲染表单对象,不是太灵活,我们可以手动处理。每个字段都可以用{{ form.name_of_field }}作为表单的一个属性,并被相应的渲染在模板中。例如:

{{ form.non_field_errors }}
<div class="fieldWrapper">{{ form.subject.errors }}<label for="{{ form.subject.id_for_label }}">Email subject:</label>{{ form.subject }}
</div>
<div class="fieldWrapper">{{ form.message.errors }}<label for="{{ form.message.id_for_label }}">Your message:</label>{{ form.message }}
</div>
<div class="fieldWrapper">{{ form.sender.errors }}<label for="{{ form.sender.id_for_label }}">Your email address:</label>{{ form.sender }}
</div>
<div class="fieldWrapper">{{ form.cc_myself.errors }}<label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>{{ form.cc_myself }}
</div>

 

 

 

完整的<label>元素还可以使用label_tag()来生成。例如:

<div class="fieldWrapper">{{ form.subject.errors }}{{ form.subject.label_tag }}{{ form.subject }}
</div>

渲染表单错误信息

表单的错误信息分两种,一种是{{ form.name_of_field.errors }}显示对应字段的错误信息列表,它默认被渲染成为无序列表,看起来如下:

<ul class="errorlist"><li>Sender is required.</li>
</ul>

该列表有一个CSS class errorlist ,允许自定义样式。如果想要进一步定义错误信息的显示,可以通过遍历来实现:

{% if form.subject.errors %}<ol>{% for error in form.subject.errors %}<li><strong>{{ error|escape }}</strong></li>{% endfor %}</ol>
{% endif %}

第二种是{{ form.non_field_errors }}显示非字段验证错误信息,它渲染后看起来如下:

<ul class="errorlist nonfield"><li>Generic validation error</li>
</ul>

该列表会额外带上一个classnonfield以便与字段验证错误信息区分。

遍历表单字段

如果表单字段使用相同的结构,可以对表单对象进行迭代:

{% for field in form %}<div class="fieldWrapper">{{ field.errors }}{{ field.label_tag }} {{ field }}{% if field.help_text %}<p class="help">{{ field.help_text|safe }}</p>{% endif %}</div>
{% endfor %}

有用的字段属性:

  • {{ field.lable }}

字段的label,比如Email address

  • {{ field.label_tag }}

该字段的label标签,它包含表单的label_suffix,默认是个冒号,例如:

<label for="id_email">Email address:</label>
  • {{ field.id_for_label }}

该字段的id,用于手动构建label

  • {{ field.value }}

该字段的值

  • {{ field.html_name }}

字段名称,用于输入元素的name属性中。如果设置了表单前置,它也会被加进去。

  • {{ field.help_text }}

与该字段关联的帮助文本

  • {{ field.errors }}

输出错误信息列表

  • {{ field.is_hidden }}

如果该字段是隐藏字段,这个属性是True,否则为False

部件

每一个表单字段,都会有一个对应的HTML元素与之对应。部件用来处理HTML渲染,以及从对应的GET/POST字典中提取数据。

指定部件

每一个表单字段,django都会使用一个默认的部件来显示数据类型。要想知道哪个字段使用哪个部件,请查看内置Field类。

有时候我们可能需要修改默认的部件,通过字段参数widget来处理。例如:

from django import formsclass CommentForm(forms.Form):name = forms.CharField()url = forms.URLField()comment = forms.CharField(widget=forms.Textarea)

字段comment将会使用Textarea部件,而不是默认的TextInput部件。

样式化部件实例

默认情况下,部件渲染的表单标签没有css类,没有额外属性。可以通过attrs参数进行设置:

class CommentForm(forms.Form):name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))url = forms.URLField()comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))

也可以在表单定义中修改部件:

class CommentForm(forms.Form):name = forms.CharField()url = forms.URLField()comment = forms.CharField()name.widget.attrs.update({'class': 'special'})comment.widget.attrs.update(size='40')

或者如果该字段没有直接在表单上声明(比如模型表单字段),可以使用Form.fields属性:

class CommentForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.fields['name'].widget.attrs.update({'class': 'special'})self.fields['comment'].widget.attrs.update(size='40')

Django会将这写属性包含在渲染的输出中:

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40" required></td></tr>

表单的校验

django中的表单除了渲染html外,还有一个很重要的作用就是校验数据。

看添加学生的视图案例:

class StudentCreateView(View):"""学生添加视图"""def post(self, request):"""添加学生"""form = StudentForm(request.POST)if form.is_valid():obj = Student.objects.create(**form.cleaned_data)return redirect(reverse('student-list'))return render(request, 'crm/student_detail.html', context={'form': form})

实例化表单时,可以将GET/POST参数传入,然后调用表单对象的is_valid()方法进行校验。如果校验通过,这个方法会返回True,否则返回False

校验通过后通过cleaned_data属性访问干净的数据。

指定字段校验

定义表单时,可以定义方法clean_<fieldname>()方法对指定的字段进行校验,该方法不接受参数。在方法中通过self.cleaned_data获取该字段的值。

如果校验不通过需要触发一个ValidationError的异常,校验通过请return该值。

在学生创建的逻辑中,我们没有验证电话号码的格式,在表单中编写一个校验方法如下:

import refrom django import forms
from django.core.exceptions import ValidationErrorfrom .models import Channel, Studentclass StudentForm(forms.ModelForm):class Meta:model = Student  # 指定要生成表单的模型exclude = ['c_time']    # 指定不需要生成的字段def clean_phone(self):phone = self.cleaned_data.get('phone')if phone is not None:if not re.match(r'1[3-9]\d{9}$', phone):raise ValidationError('手机号码格式不正确!')return phone

验证相互依赖的字段

有时候需要同时校验多个字段,比如注册时,校验密码和重复密码。这时复写clean()方法是一个很好的办法:

from django import forms
from django.core.exceptions import ValidationErrorclass RegistorForm(forms.Form):# Everything as before.def clean(self):cleaned_data = super().clean()password = cleaned_data.get('password')password_confirm = cleaned_data.get('password_confirm')if not password == password_confirm:raise ValidationError('输入的密码不一致!')return cleaned_data

在表单的clean()方法被调用前,上一节中的单字段校验方法都会先被运行。clean()方法中如果出现验证错误,在模板中使用{{form.non_field_errors}}显示。

模型表单

django提供了一个辅助类,可以从一个模型创建一个Form类,而不需要重复定义字段。

修改学生表单如下:

from django import forms
from .models import Channel, Studentclass StudentForm(forms.ModelForm):class Meta:model = Student  # 指定要生成表单的模型exclude = ['c_time']    # 指定不需要生成的字段

每一个模型表单都是forms.ModelForm的一个子类,和普通表单不同。由于模型已经定义了字段,在模型表单中,只需要在Meta类中指定模型和字段。

字段可以通过属性fields=['field1', 'field2', ..]指定需要的字段,fields='all'表示生成所有的字段, 也可以通过exclude = ['field1', 'field2', ..]排除字段。

save()

模型表单与普通的表单还有一个不同就是save()方法。在校验过的表单实例上调用save()方法,会自动调用对应的模型在数据库中创建数据或修改数据。

学生添加案例:

class StudentCreateView(View):"""学生添加视图"""def post(self, request):"""添加学生"""# 实例化表单form = StudentForm(request.POST)# 校验if form.is_valid():# 保存数据form.save()return redirect(reverse('student-list'))return render(request, 'crm/student_detail.html', context={'form': form})

上面的代码中,如果表单校验通过,执行form.save()会创建返回Student实例并保存到数据库。

学生更新案例:

class StudentUpdateView(View):"""学生更新视图"""def get_obj(self, pk):obj = get_object_or_404(Student, pk=pk)return objdef get(self, request, pk):# 1. 获取修改对象obj = self.get_obj(pk)# 2. 实例化表单对象,并填充模型对象form = StudentForm(instance=obj)# 2. 渲染并返回修改页面return render(request, 'crm/student_detail.html', context={'form': form})def post(self, request, pk):# 1. 获取修改对象obj = self.get_obj(pk)# 2. 实例化表单对象,填充前端传递的数据和模型对象form = StudentForm(request.POST, instance=obj)# 3. 校验if form.is_valid():form.save()     # 保存更新return redirect(reverse('student-list'))return render(request, 'crm/student_detail.html', context={'form': form})

上面的代码中实例化表单时传递POST参数,同时把要更新的模型对象传给instance参数,在校验通过后,执行form.save()会使用校验后的参数更新模型对象。

学生创建,更新视图案例

表单

# crm/froms.py
import refrom django import forms
from django.core.exceptions import ValidationErrorfrom .models import Studentclass StudentForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name in self.fields:self.fields[name].widget.attrs.update({'class': 'form-control'})class Meta:model = Student  # 指定要生成表单的模型exclude = ['c_time']    # 指定不需要生成的字段def clean_phone(self):phone = self.cleaned_data.get('phone')if not re.match(r'1[3-9]\d{9}$', phone):raise ValidationError('手机号码格式不正确!')return phone

视图

# crm/views.py
class StudentCreateView(View):"""学生添加视图"""def get(self, request):"""学生添加页面"""# 1. 获取渠道对象channels = Channel.objects.all()form = StudentForm()return render(request, 'crm/student_detail.html', context={'channels': channels, 'form': form})def post(self, request):"""添加学生"""form = StudentForm(request.POST)if form.is_valid():form.save()return redirect(reverse('student-list'))return render(request, 'crm/student_detail.html', context={'form': form})class StudentUpdateView(View):"""学生更新视图"""def get_obj(self, pk):obj = get_object_or_404(Student, pk=pk)return objdef get(self, request, pk):# 1. 获取修改对象obj = self.get_obj(pk)# 2. 实例化表单对象,并填充模型对象form = StudentForm(instance=obj)# 2. 渲染并返回修改页面return render(request, 'crm/student_detail.html', context={'form': form})def post(self, request, pk):# 1. 获取修改对象obj = self.get_obj(pk)# 2. 实例化表单对象,填充前端传递的数据和模型对象form = StudentForm(request.POST, instance=obj)# 3. 校验if form.is_valid():form.save()     # 保存更新return redirect(reverse('student-list'))return render(request, 'crm/student_detail.html', context={'form': form})

模板

<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>{% if obj %}修改{% else %}添加{% endif %}学生</title><!-- Bootstrap --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous"><!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 --><!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 --><!--[if lt IE 9]><![endif]-->
</head>
<body>
<div class="container"><div style="width: 800px"><h1>学生{% if obj %}修改{% else %}添加{% endif %}页面</h1><form class="form-horizontal" method="post">{% for field in form %}<div class="form-group {% if field.errors %}has-error{% endif %}"><label for="{{ field.id_for_label }}" class="col-sm-2 control-label">{{ field.label }}</label><div class="col-sm-10">{{ field }}{% for error in field.errors %}<span class="help-block">{{ error }}</span>{% endfor %}</div></div>{% endfor %}<div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-default">{% if form.instance %}修改{% else %}添加{% endif %}</button></div></div></form></div>
</div><!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ"crossorigin="anonymous"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"crossorigin="anonymous"></script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72314.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第六天 |哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集 、202. 快乐数、 1. 两数之和

打卡第六天&#xff0c;补昨天的卡 今日任务 哈希表理论基础242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和 哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 哈希表能解决什么问题呢? 一般哈希表都是用来快速判断一个元素是否出现集合里。 …

Tr0ll1靶机训练

信息收集 主机探测 端口扫描 21,22,80端口开放通过浏览器访问并进行指纹识别&#xff0c;并没没有发现什么有用信息 测试 观察发现21端口开放&#xff08;ftp&#xff09;尝试进行匿名登录发现其中存在一个流量文件将其下载 并将文件用wirwshark打开&#xff0c;追踪其TCP流(…

BEV感知:DETR3D

3D检测&#xff1a;DETR3D前言MethodImage Feature Extracting2D-to-3D Feature TransformationLoss实验结果前言 在这篇paper&#xff0c;作者提出了一个更优雅的2D与3D之间转换的算法在自动驾驶领域&#xff0c;它不依赖于深度信息的预测&#xff0c;这个框架被称之为DETR3D…

【C进阶】数据的存储

文章目录:star:1. 数据类型:star:2. 整形在内存中的存储2.1 存储规则2.2 存储模式2.3 验证大小端模式:star:3. 数据范围3.1 整形溢出3.2 数据范围的求解3.3 练习:star:4. 浮点型在内存中的存储4.1 浮点数的存储规则4.2 练习5. :star::star:总结(思维导图)⭐️1. 数据类型 在了…

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里&#xff1a;阿里云官网 二、查看库 阿里云制品仓库Packages &#xff08;注&#xff1a;如果没有创建企业或个人使用&#xff0c;按照提示&#xff0c;选个人使用&#xff09; 三、选择类型 选择其中一个&#xff08;两…

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年&#xff0c;中国车载毫米波雷达市场战火明显升级。 一方面&#xff0c;愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间&#xff0c;也快速转移到与国产供应商之间&#xff1b;随着部分外资巨头的本土化战略深入落地&#xff0c;同时对国产供应商造成了压力。 …

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后&#xff0c;现在来配置一下对…

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表&#xff0c;事务B修改了id2的name字段为李老四&#xff0c;但是没有提交&#xff0c;事务A查询id2的数据&#xff0c;得到name为李老四&#xff1b;事务B发生回滚&#xff0c;id2的数据的name又变回李四&…

性能测试知多少?怎样开展性能测试

看到好多新手&#xff0c;在性能需求模糊的情况下&#xff0c;随便找一个性能测试工具&#xff0c;然后就开始进行性能测试了&#xff0c;在这种情况下得到的性能测试结果很难体现系统真实的能力&#xff0c;或者可能与系统真实的性能相距甚远。 与功能测试相比&#xff0c;性能…

【Spring Boot 原理分析】- 自动配置

【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能&#xff0c;通过这个功能可以实现选择的创建 Bean 操作 &#x1f451; 我们在使用 Spring 的时候&#xff0c;只需导入某个依赖的坐标&#xff0c;就可以直接通过 Autwired 注…

堆,堆构建,堆排序,PriorityQueue和TopN问题

零. 前言 堆作为一种重要的数据结构&#xff0c;在面笔试中经常出现&#xff0c;排序问题中&#xff0c;堆排序作为一种重要的排序算法经常被问道&#xff0c;大顶堆小顶堆的应用经常出现&#xff0c;经典的问题TopN问题也是堆的重要应用&#xff0c;因此&#xff0c;了解并掌握…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

登录逻辑漏洞整理集合

目录一、任意用户注册1.未验证邮箱/手机号2、不安全验证邮箱/手机号3.批量注册4.个人信息伪造5.前端验证审核绕过6.用户名覆盖二、任意用户登录1、万能密码2、验证码、密码回显3、登录检测不安全三、任意账号重置1、重置账号名2、验证码3、MVC数据对象自动绑定4、Unicode字符处…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

强化学习DQN之俄罗斯方块

强化学习DQN之俄罗斯方块强化学习DQN之俄罗斯方块算法流程文件目录结构模型结构游戏环境训练代码测试代码结果展示强化学习DQN之俄罗斯方块 算法流程 本项目目的是训练一个基于深度强化学习的俄罗斯方块。具体来说&#xff0c;这个代码通过以下步骤实现训练&#xff1a; 首先…

车机开发【Android SystemUI 架构音量控制详解】

SystemUI介绍 SystemUI摘要 在Android系统中SystemUI是以应用的形式运行在Android系统当中&#xff0c;即编译SystemUI模块会生产APK文件&#xff0c;源代码路径在frameworks/base/packages/SystemUI/&#xff0c;安装路径system/priv-app/-SystemUI。 什么是SystemUI 在前…

使用带有 Moveit 的深度相机来避免碰撞

文章目录 什么是深度相机?如何将 Kinect 深度相机添加到您的环境中在 Rviz 中可视化深度相机数据在取放场景中使用深度相机将深度相机与您的 Moveit 设置一起使用有很多优势。机器人可以避免未知环境中的碰撞,甚至可以对周围的变化做出反应。然而,将深度相机连接到您的设置并…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…