最经编写一个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字段统一目录、不修改文件名的方法的更多相关文章

  1. Django models 的常用字段类型和字段参数

    <1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符 ...

  2. [置顶] Python+Django 复选框选择多个 提交只能保存单个

    之前,做表单时使用单选方式,今天修改为复选框方式提交. 问题来了:在选择多个后保存,发现竟然只能最后一个选择. print(request.POST)显示只有最后一个 print(str(reques ...

  3. django Models 常用的字段和参数

    1.字段 CharField IntegerField floatField DateTimeField DateField DecimalField 2.参数 null default choice ...

  4. [置顶] 【VB.NET2010】在空间上显示提示气泡框的方法

    在VB6中,有ToolTip这个属性,可以设置鼠标悬浮在控件上的时候显示的图像. 而,在VB.NET中,实现这个功能需要使用一个类,ToolTip类. 代码如下(为了立即起效,建议将这些代码放在For ...

  5. Django 将APP存储至统一目录

    项目根目录下创建apps目录 mkdir apps 将应用移动到apps目录下 这里取消  search for references   ,open moved files in edito 选择 ...

  6. MySQL 上移/下移/置顶

    在编写网站系统时,难免会用到上移.下移.置顶的功能,今天小编就介绍一下我的思路. 首先,需要一张数据表: CREATE TABLE `a` ( `id` ) NOT NULL AUTO_INCREME ...

  7. 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件

    <?php /** * 目录操作 删除目录 删除置顶类型文件 */ //echo rmdir('61') or die('目录删除失败'); //删除一个目录中有其他文件的内容的方法: //第1 ...

  8. Django models 的字段类型

    1.models.AutoField   ---自增列 = int(11)    如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_k ...

  9. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

随机推荐

  1. 多线程 线程池 ExecutorService

    package org.zln.thread; import java.util.Date; import java.util.concurrent.ExecutorService; import j ...

  2. [luogu3676] 小清新数据结构题 [树链剖分+线段树]

    题面 传送门 思路 本来以为这道题可以LCT维护子树信息直接做的,后来发现这样会因为splay形态改变影响子树权值平方和,是splay本身的局限性导致的 所以只能另辟蹊径 首先,我们考虑询问点都在1的 ...

  3. 虚拟机——mnt_hgfs下无目录情况解决

    /mnt/hgfs下无目录情况解决: VMware8虚拟机安装Ubuntu 11.10使用share folders共享目录将虚拟机掉电关闭(不能暂停),设置share folders目录,重启虚拟机 ...

  4. vue虚拟dom原理

    Virual DOM是用JS对象记录一个dom节点的副本,当dom发生更改时候,先用虚拟dom进行diff,算出最小差异,然后再修改真实dom. vue的virtual dom的diff算法是基于sn ...

  5. Tomcat学习笔记(十二)

    Host和Engine容器 Context容器的父容器通常是Host容器. Engine容器表示Catalina的整个servlet引擎.如果使用Engine容器,那么它总是处于容器层级的最顶层.默认 ...

  6. 3.3 Lucene检索原理

    Lucene是一个高效的,基于Java的全文检索库[1].所以在介绍Lucene的检索功能之前,我们要先了解一下全文检索以及Lucene的索引结构. 一.全文检索的基本原理 1. 数据的分类 什么是全 ...

  7. ci的数据库地址

    CI在linux服务器上运行的时候,数据库配置主机名的时候必须是127.0.0.1,而不是localhost.并且phpmyadmin也有这样的要求

  8. classpath: spring 中的查找方式

    Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.classpath*:的出现是为了从多个jar文件中加载相同的文 ...

  9. java io 网络编程 高性能NIO

    很久没写了,一是觉得这后台不怎么方便,二是 写的时候突然觉得没兴趣了. 还好,今天突然想记一下,那就随便写吧.  1.一开始还是放几个连接.  什么是 同步,异步,阻塞,非阻塞 : http://bl ...

  10. (转)巴氏(bash)威佐夫(Wythoff)尼姆(Nim)博弈之模板

    感谢:巴氏(bash)威佐夫(Wythoff)尼姆(Nim)博弈之模板 转自:http://colorfulshark.cn/wordpress/巴氏(bash)威佐夫(wythoff)尼姆(nim) ...