You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django按指定规则重命名用户上传文件技术求助

解决方案

要在Django文件上传时获取表单对应的标签名并用于重命名,核心问题是默认的upload_to回调仅提供instance和filename参数,无法直接拿到当前上传的字段信息。我们可以通过闭包或可调用类来传递字段标识,进而获取对应的标签文本。

方法一:使用闭包传递字段信息

先定义一个返回上传路径函数的外层函数,将字段名作为参数传入,内部函数根据字段名匹配表单标签:

import os

def get_upload_path(field_name):
    # 映射字段名到表单标签,与你表单中的labels保持一致
    field_label_map = {
        'certificado_antecedentes': 'Certificado Antecedentes',
        'hoja_de_vida_conductor': 'Hoja de vida del conductor',
    }
    
    def upload_directory_name(instance, filename):
        # 获取对应的标签,未匹配到则用字段名兜底
        label = field_label_map.get(field_name, field_name)
        # 处理标签格式(替换空格为下划线、转小写,可按需调整)
        formatted_label = label.replace(' ', '_').lower()
        # 提取文件扩展名
        ext = filename.split('.')[-1]
        # 按规则生成新文件名
        filename = f"DSR_{instance.rut}_{instance.name}_{formatted_label}_0.{ext}"
        return os.path.join('uploads', filename)
    
    return upload_directory_name

然后在Candidato模型中,为每个文件字段指定对应的upload_to:

from django.db import models

class Candidato(models.Model):
    rut = models.CharField(max_length=20)  # 按你的实际模型字段调整
    name = models.CharField(max_length=100)
    certificado_antecedentes = models.FileField(upload_to=get_upload_path('certificado_antecedentes'))
    hoja_de_vida_conductor = models.FileField(upload_to=get_upload_path('hoja_de_vida_conductor'))

方法二:使用可调用类实现

如果偏好面向对象的方式,可以定义一个可调用类,通过构造函数传入字段名:

import os

class UploadPathGenerator:
    def __init__(self, field_name):
        self.field_name = field_name
        self.field_label_map = {
            'certificado_antecedentes': 'Certificado Antecedentes',
            'hoja_de_vida_conductor': 'Hoja de vida del conductor',
        }
    
    def __call__(self, instance, filename):
        label = self.field_label_map.get(self.field_name, self.field_name)
        formatted_label = label.replace(' ', '_').lower()
        ext = filename.split('.')[-1]
        filename = f"DSR_{instance.rut}_{instance.name}_{formatted_label}_0.{ext}"
        return os.path.join('uploads', filename)

模型中使用方式:

class Candidato(models.Model):
    # ... 其他字段
    certificado_antecedentes = models.FileField(upload_to=UploadPathGenerator('certificado_antecedentes'))
    hoja_de_vida_conductor = models.FileField(upload_to=UploadPathGenerator('hoja_de_vida_conductor'))

说明

  • 若不需要表单标签文本,只想用字段名(如certificado_antecedentes)作为文件名部分,可直接移除field_label_map映射,直接使用field_name即可。
  • formatted_label的格式处理是为了适配文件名规范,你可以根据需求调整(比如保留原大小写、替换特殊字符等)。

内容的提问来源于stack exchange,提问作者Rikardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:20:36