1. form的使用(自带前端验证的提示)
django提供的forms组件,可以在页面使用自带校验的表单
label:在页面上可以用于显示控件文本的属性
required:验证(当前属性是否可以为null),是否为必填项,默认都是必填项 True
(1)填充文本:长度限制
max_length
min_length
(2)如果是选项(单选、多选、下拉)
choices = 备选项
widget 展示形式(当前属性在页面上呈现的状态)
# attributes 属性:
# class指定css样式、
# placeholder占位(没有填充内容的时候显示什么)
# type 展示形式:date和time (日期和时间)
attrs
# 服务端验证时使用的,客户端验证用不到
# 客户端验证:前端验证,在浏览器上直接验证(request之前)
# 服务端验证:后台验证,在request之后,到django环境下进行验证
error_messages 错误提示
2. 文件存储到数据库中(binary stream的形式)
(1)前提:如果form和model的属性类型都一致,可以使用Form的数据代替model的数据
ModelForm 基于模型创建视图(基于model创建view)
视图Form表单的所有控件依赖于model中创建的类型(包括选择框)
models也可以提供备选数据 choices=((key,value),(k2,v2))
(2)文件存储:
model:映射到数据库能存储 图片(二进制数据)longblob 2G
在下载特别大的文件时,会下载到多个rar文件
BinaryField 二进制 python中的二进制流
byte[] 或 char[]
form:映射表单的时,用的是 FileField
总结 :
model中:文件:BinaryField(映射到数据库是longblob)
form中用的是FileField类型,需要进行read操作
read操作将 FileField 文件类型的内容读取出来,得到了 stream形式
stream形式可以直接传递给 BinaryField 类型
同时,stream还可以通过outputTarget(输出流)写入到django服务端
上传 同时 完成了 服务端的图片写入 和 数据库的二进制存储
for field,value in 表单.items():
if 是文件:
~~流~~ = 值.read()
文件输出流 = 指向open(django服务器位置,'bw')
文件输出流.write(~~流~~)
模型.binary属性 = ~~流~~ # 因为直接等于文件无效,必须等于文件.read()
else:
setattr(模型, 属性, form中的值)
模型.save()
3. 模型的objects对象的功能
from django.shortcuts import render, HttpResponse
from myApp01 import forms, models
from datetime import datetime
# Create your views here.
def testForm(request):
if request.method == "GET":
frmObj = forms.ComponentForm()
ctx = {"obj": frmObj}
return render(request, "testForm.html", context=ctx)
elif request.method == "POST":
frmObj = forms.ComponentForm(request.POST)
# valid 验证 validate(验证,认证)
# is_valid 已经通过了前端验证(django的forms控件自带的一套验证已经通过)
if frmObj.is_valid():
# 获取到提交的form表单数据,不包括表单的控件信息
frmData = frmObj.cleaned_data
print(frmData)
# 创建一个model,准备向数据库同步数据
modelObj = models.ComponentModel()
# set设置 attr属性,设置属性
# 将 forms 中的属性,转存到 models 中
for field, value in frmData.items():
setattr(modelObj, field, value)
# print(modelObj)
modelObj.save() # 同步存储到数据库
return HttpResponse("success ")
# 使用 model 创建一个 from
def testModelForm(request):
if request.method == "GET":
frmObj = forms.EmployeeForm()
ctx = {"obj": frmObj}
return render(request, "testModelForm.html", context=ctx)
elif request.method == "POST":
return HttpResponse("success")
import os
from django.conf import settings
# 显示文件上传的界面
def HyperTextForm(request):
if request.method == "GET":
frmObj = forms.HyperTextForm()
ctx = {"obj": frmObj}
return render(request, "HyperTextForm.html", context=ctx)
elif request.method == "POST":
# 使用页面添加的数据,对 forms 表单对象进行数据填充
# 需要提供两个参数:得到文本数据,得到超文本(流)数据
frmObj = forms.HyperTextForm(request.POST, request.FILES)
modelObj = models.HyperTextModel()
if frmObj.is_valid():
frmData = frmObj.cleaned_data
# 出现了bytes 字节s(一堆字节)
for field,value in frmData.items():
# 如果是图片类型,必须进行特殊处理,将原来的file对象执行read方法,得到 binary类型
# file 和 binary
# binary就是file的内容,file是包含内容,而且包含文件外壳的对象
if field == "htFile":
# 如果是文件类型,则对文件进行一个read操作
modelObj.htFile = value.read()
# 能不能同步也存储到django目录下一份
# 得到路径
baseDir = settings.BASE_DIR
# 生成带有时间戳的文件名称
beforeName = str(value);
fileName = "img_" + datetime.strftime(datetime.now(), '%Y%m%d%H%M%S') + beforeName
print(fileName)
# 定位输出流指向 目标位置
outputTarget = open(os.path.join(os.path.join(baseDir, "static"), fileName), 'bw') # binary write
# 执行写入操作(参数:流数据)
outputTarget.write(modelObj.htFile)
# 关闭输出流
outputTarget.close()
# 同时存储拷贝名称(带有时间戳的)
# 有了备份名称和数据库中的binary数据,可以对图片进行还原
modelObj.cpName = fileName
else:
setattr(modelObj, field, value)
modelObj.save()
return HttpResponse("save success !! ")
from django.db import models
from datetime import datetime
# Create your models here.
class ComponentModel(models.Model):
cpnCode = models.CharField(max_length=20)
cpnDate = models.DateField()
cpnTime = models.TimeField()
# 等价于java面向对象,封装的 toString 方法(对Object类的重写override)
# 提供了类(对象)的字符串表达形式
def __str__(self):
return self.cpnCode + ", " + datetime.strftime(self.cpnDate, '%Y-%m-%d')
# 当 model 和 form 的各个属性一致时,可以使用
class EmployeeModel(models.Model):
empCode = models.IntegerField()
empName = models.CharField(
max_length=20,
null=True, # 设置数据库对应的列是否允许 null
blank=True, # 设置表单是否为必填项,blank=True表示可以不填(非必填项)
)
empSex = models.CharField(
max_length=8,
choices=((0, '女'), (1, '男')),
default=0,
)
# 对于文件信息的存储,数据库中使用 BinaryField
class HyperTextModel(models.Model):
# BinaryField 是流数据,不能以文本的形式进行编辑
htFile = models.BinaryField(null=True) # 默认映射为 longblob
htName = models.CharField(max_length=100)
htDate = models.DateField(default=datetime.now)
cpName = models.CharField(max_length=50, null=True)