1.26django学习日志

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)

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值