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

Django中如何从元组获取文件扩展名并生成文件名?

Django动态设置文件扩展名问题

问题背景

原本代码固定将文件扩展名设为.pdf,代码如下:

def generate_filename(instance, filename):
    filename = instance.title + '.pdf'
    return "{0}/{1}".format(instance, filename)

class Book(models.Model):
    title = models.CharField(max_length=200, db_index=True, verbose_name='Name')

之后新增文件格式选择字段,定义格式元组并更新Book模型:

FORMAT = (
    (1, 'PDF'),
    (2, 'FB2'),
    (3, 'EPUB'),
    (4, 'MOBI'),  
    (5, 'TXT'),
    (6, 'DJVU'),
    (7, 'DOC'),
    (8, 'ZIP'),
    (9, 'RAR'),
)

class Book(models.Model):
    title = models.CharField(max_length=200, db_index=True, verbose_name='Name')
    formate = models.IntegerField(choices=FORMAT, default=1, db_index=True, verbose_name='Format file')

遇到的错误

尝试修改generate_filename函数动态获取扩展名时:

filename = instance.title + '.' + formate

触发错误:

name 'formate' is not defined

补充代码

项目中已有的视图和Mixin代码:

class BookDetail(ObjectDetailMixin, View):
 model = Book
 template = 'booklist/book_detail.html'
class ObjectDetailMixin:
 model = None
 template = None
 detail_admin_panel = None

 def get(self, request, **kwargs):
     obj = get_object_or_404(self.model, slug=kwargs['slug'])

     context = {
         self.model.__name__.lower(): obj,
         'categories': Category.objects.all(),
     }

     return render(request, self.template, context=context)

解决方案

错误原因是直接使用formate变量,但它是Book实例的属性,需通过instance.formate访问。同时注意formate存储的是数字,需要转换为对应扩展名:

  1. 创建格式映射字典,实现数字到小写扩展名的转换:
FORMAT_MAP = {
    1: 'pdf',
    2: 'fb2',
    3: 'epub',
    4: 'mobi',
    5: 'txt',
    6: 'djvu',
    7: 'doc',
    8: 'zip',
    9: 'rar',
}
  1. 修改generate_filename函数:
def generate_filename(instance, filename):
    # 获取对应格式的扩展名,默认用pdf兜底
    ext = FORMAT_MAP.get(instance.formate, 'pdf')
    filename = f"{instance.title}.{ext}"
    return "{0}/{1}".format(instance, filename)

这样就能根据Book实例的formate字段动态生成对应文件扩展名。另外注意字段名formate拼写缺少一个't',如果已生成数据库表,修改字段名需要处理迁移问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:23:13