我有这样的模特:
class File(models.Model):
name = models.CharField(max_length=45)
description = models.CharField(max_length=100, blank=True)
file = models.FileField(upload_to='files')
我在视图中获取所有File对象,并根据文件类型,我想打印适当的类:
<a class="pdf">link</a>
或
<a class="word">link</a>
或
<a class="other">link<a/>
在我的模板中。
如何在Django模板中获取文件扩展名?
我想这样想:
{% for file in files %}
{% if file.get_extension == 'pdf' %}
<a class="pdf">link</a>
{% elif file.get_extension = '.doc' %}
<a class="word">link</a>
{% else %}
<a class="other">link<a/>
{% endif %}
{% endfor %}
当然,'file.get_extension'不存在......
答案 0 :(得分:23)
你的模特上遗漏了.get_extension
?这很简单,只需添加它:-)您可以在模型上使用各种方法。所以像这样:
class File(models.Model):
name = models.CharField(max_length=45)
description = models.CharField(max_length=100, blank=True)
file = models.FileField(upload_to='files')
def extension(self):
name, extension = os.path.splitext(self.file.name)
return extension
(名称.extension()
比.get_extension()
,btw更具pythonic。
你可以走得更远。是不是因为/ else结构在你的模板中有点单调乏味?它在Python代码中不那么麻烦:
class File(models.Model):
...
def css_class(self):
name, extension = os.path.splitext(self.file.name)
if extension == 'pdf':
return 'pdf'
if extension == 'doc':
return 'word'
return 'other'
模板更简单:
{% for file in files %}
<a class="{{ file.css_class }}">link</a>
{% endfor %}
答案 1 :(得分:2)
我不知道是否有一个漂亮的内置django函数来执行此操作,但您可以从文件字段中获取扩展名
fileName, fileExtension = os.path.splitext(file.name)
如果您已在模板中执行此操作,则可以创建包含此
的自定义标记https://docs.djangoproject.com/en/dev/howto/custom-template-tags/