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函数类似


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值