[置顶] python3 django models保存filefiled字段统一目录、不修改文件名的方法
最经编写一个model时处理filefiled,使用post_form.save()进行新增和编辑文件保存位置不统一,如果出现重复文件名重复的话,上传文件名会被改名。
现有代码如下:
models.py
class Wechat_Pubno(models.Model):
name = models.CharField(verbose_name='名称*' , max_length=30 , blank=False , unique=True)
qr_code = models.ImageField(verbose_name='二维码', upload_to='upload/basicdata/wechat_pubno')
def __str__(self):
return self.name
forms.py
class Forms_Wechat_Pubno(forms.ModelForm):
def __init__(self , *args , **kwargs):
super(Forms_Wechat_Pubno , self).__init__(*args, **kwargs)
self.fields['qr_code'].required = False class Meta :
model = Wechat_Pubno
fields = '__all__'
views.py
def add(request):
if request.method == 'POST':
post_form = forms(request.POST,request.FILES)
if post_form.is_valid():
post_form.save()
#配合post_form = forms(request.POST,request.FILES),web页面上传文件正常保存,而且不会重复
return HttpResponseRedirect(reverse('list_' + self.model_name))
else :
errors_message = post_form.errors
write_log('warning' , op_user, model_cnname + '新增失败' + str(post_form) + ',原因如下:\n' + str(errors_message))
return render(request, 'result.html', {'error_message': str(errors_message)})
else :
get_form = forms()
request_dict = {'title_name' : title_name , 'get_form': get_form}
return render(request, 'add_edit.html', request_dict)
改进views.py
def add(request):
if request.method == 'POST':
post_form = forms(request.POST,request.FILES)
if post_form.is_valid():
# 这段代码完全是为了处理filefiled,如果不需要使用filefiled的话,直接post_form.save()
media_dir = MEDIA_ROOT.replace(BASE_DIR + '/', '')
new_value = {}
for key in detail_field_list :
# 处理filefield
try :
if key in filefield_dict :
filename = key + '_' + str(request.FILES[key])
# 文件名,字段名+上传文件名
file = request.FILES[key]
upload_dir = MEDIA_ROOT + '/upload/' + app_name + '/' + model_name + '/' + request.POST.get('name') + '/'
# 上传目录,MEDIA_ROOT/upload/app名/modles名/字段name的值/ from library.webpage import uploadfile
fullfilename = uploadfile(file, filename, upload_dir)
# 最终目录为MEDIA_ROOT.replace(BASE_DIR,'')/upload/app名/modles名/字段name的值/字段名_上传文件名,防止出现重复替换操作
value = media_dir + '/upload/' + app_name + '/' + model_name + '/' + request.POST.get('name') + '/' + filename
# 数据库中写相对路径
else :
value = request.POST.get(key)
except :
value = request.POST.get(key) # 日期转换
if re.search('^[0-9][0-9][0-9][0-9]/[0-1][0-9]', str(value)) :
from library.handle_datetime import date_convert
new_value[key] = date_convert(value , '%Y-%m-%d')
else:
new_value[key] = value try :
import_models.objects.create(**new_value)
except Exception as e :
print('新增数据失败,' + str(new_value) + ',原因如下:\n' + str(e)) return HttpResponseRedirect(reverse('list_' + model_name))
else :
......
else :
......
edit函数类似
这样的话,可以统一,便于展示页面展示图片
[置顶] python3 django models保存filefiled字段统一目录、不修改文件名的方法的更多相关文章
- Django models 的常用字段类型和字段参数
<1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符 ...
- [置顶]
Python+Django 复选框选择多个 提交只能保存单个
之前,做表单时使用单选方式,今天修改为复选框方式提交. 问题来了:在选择多个后保存,发现竟然只能最后一个选择. print(request.POST)显示只有最后一个 print(str(reques ...
- django Models 常用的字段和参数
1.字段 CharField IntegerField floatField DateTimeField DateField DecimalField 2.参数 null default choice ...
- [置顶] 【VB.NET2010】在空间上显示提示气泡框的方法
在VB6中,有ToolTip这个属性,可以设置鼠标悬浮在控件上的时候显示的图像. 而,在VB.NET中,实现这个功能需要使用一个类,ToolTip类. 代码如下(为了立即起效,建议将这些代码放在For ...
- Django 将APP存储至统一目录
项目根目录下创建apps目录 mkdir apps 将应用移动到apps目录下 这里取消 search for references ,open moved files in edito 选择 ...
- MySQL 上移/下移/置顶
在编写网站系统时,难免会用到上移.下移.置顶的功能,今天小编就介绍一下我的思路. 首先,需要一张数据表: CREATE TABLE `a` ( `id` ) NOT NULL AUTO_INCREME ...
- 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件
<?php /** * 目录操作 删除目录 删除置顶类型文件 */ //echo rmdir('61') or die('目录删除失败'); //删除一个目录中有其他文件的内容的方法: //第1 ...
- Django models 的字段类型
1.models.AutoField ---自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_k ...
- Django文档——Model字段类型(Field Types)
大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...
随机推荐
- UVA1316 Supermarket
题目描述 有一个商店有许多批货,每一批货又有N(0<=N<= 10^4104 )个商品,同时每一样商品都有收益 P_iPi ,和过期时间 D_iDi (1<= Pi,DiPi,D ...
- 「JOISC 2015 Day 1」卡片占卜
题目描述 K 理事长是占卜好手,他精通各种形式的占卜.今天,他要用正面写着 I ,背面写着 O 的卡片占卜一下日本 IOI 国家队的选手选择情况. 占卜的方法如下: 首先,选取五个正整数 A,B,C, ...
- 每天一个小算法(Shell Sort1)
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...
- 在Linux内核中添加系统调用,并编译内核
1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKer ...
- Debian中文字体安装
默认装的英文办的debian7,看中国字不太美,这好办照着做吧 1. Setup locales #dpkg-reconfigure locales 选择 zh_CN GB2312 zh_CN.GBK ...
- vue-cli脚手架的.babelrc文件
虽然es6还没被浏览器全部支持,但是使用es6是大势所趋,所以babel应运而生将es6代码转换成浏览器能够识别的代码 什么是.babelrc文件呢? 熟悉linux的同学一定知道,rc结尾的文件通常 ...
- canvas2D 基础知识 浅析
1.canvas HTML5给出的一个可以展示绘图内容的标签 使用领域: (推荐网站:threejs.org) 1. 游戏 2. 可视化数据 3. Banner广告 4. 多媒体 (1)在 c ...
- bzoj3638 Cf172 k-Maximum Subsequence Sum
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3638 [题解] 看到k<=20就感觉很py了啊 我们用一棵线段树维护选段的过程,能选到 ...
- Leap Motion颠覆操控体验的超精致手势追踪技术【转】
转自:http://www.cnblogs.com/emouse/archive/2013/02/28/2936689.html 先来看两段简介视频: 看了介绍视频后,对如此次超高精度的手势追踪非常好 ...
- 关闭 C4996 警告(_CRT_SECURE_NO_DEPRECATE)
在使用VC 2005 的开发者会遇到这样的问题,在使用std命名空间库函数的时候,往往会出现类似于下面的警告: warning C4996: strcpy was declared deprecate ...