最经编写一个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函数类似

这样的话,可以统一,便于展示页面展示图片

最新文章

  1. Linux相关文章
  2. Javascript Date Format
  3. XE10 Seattle error___seh_personality_v0
  4. 万网免费主机wordpress快速建站教程-wordpress下载及安装
  5. CSS学习笔记(1):选择器
  6. 升级Xcode6.3插件失效解决办法
  7. MAC Eclipse 快捷键
  8. stm32之595(spi芯片)
  9. C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements
  10. PHP7源码安装MongoDB和MongoDB拓展
  11. mac php7.0~7.2 memcache安装
  12. Hash算法的讲解
  13. docx httpheader头设置
  14. tensorflow变量
  15. 【shell】wc命令
  16. robot framework学习二-----元素定位
  17. EnumUtil
  18. Oracle安装部署之rhel 5.8下静默安装oracle11gr2
  19. MVC初识
  20. 【Linux】 无密码SCP在Crontab中失效的解决办法

热门文章

  1. 通过命令行安装或卸载Tomcat服务
  2. PAT 1050 螺旋矩阵
  3. (总结)Nginx与Apache、Tomcat、Resin动静分离核心配置
  4. 【bzoj4952】[Wf2017]Need for Speed 二分
  5. 关于CPU位数,OS位数以及内存大小关系的一点总结
  6. P4397 [JLOI2014]聪明的燕姿
  7. 【CZY选讲·扩展LCS】
  8. HDU 1863 畅通工程 -Kruskal模版
  9. C++ primer 学习笔记之容器insert
  10. eclipse 调试(debug) burpsuite 插件(Extender)