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存储的是数字,需要转换为对应扩展名:
- 创建格式映射字典,实现数字到小写扩展名的转换:
FORMAT_MAP = { 1: 'pdf', 2: 'fb2', 3: 'epub', 4: 'mobi', 5: 'txt', 6: 'djvu', 7: 'doc', 8: 'zip', 9: 'rar', }
- 修改
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
相关产品推荐
相关产品推荐

