• [置顶] 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) + ',原因如下:
    ' + 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) + ',原因如下:
    ' + str(e))
    
                return HttpResponseRedirect(reverse('list_' + model_name))
            else :
                ......
        else :
            ......

    edit函数类似


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

  • 相关阅读:
    数据结构:图 (总结)
    排序算法总结(此篇文章是14年写作,代码难看,请看我新发表的排序总结)
    no identifier specified for entity错误
    哈夫曼编码算法思想总结
    线索二叉树
    ORACLE 错误 ora-01830 解决方法
    (转)web会话管理方式
    (转)C3P0配置
    分页技术()
    简易 DBUtil 封装
  • 原文地址:https://www.cnblogs.com/lykops/p/7348045.html
Copyright © 2020-2023  润新知