Python Django Template无法从模型函数

时间:2016-10-18 10:14:06

标签: python django file filefield

虽然我知道我可以从模型中调用函数定义,但我似乎无法提取上传文档的文件名。下面我尝试了以下模板格式,但要么是我想要的输出结果:

.html版本1

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.docfile.filename }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

结果:它只显示按钮。

.html第2版

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.filename }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

结果:它只显示按钮。

.html第3版

<form action="." method="GET">
{% if documents %}
   <ul>
      {% for document in documents %}
        <li> {{ document.docfile.name }}
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      {% endfor %}
  </ul>

结果:打印完整的路径名(例如:/documents/2016/10/08/filename.csv)和按钮

这是我的其余代码:

models.py

class Document(models.Model):
     docfile = models.FileField(upload_to='document/%Y/%m/%d')

     def filename(self):
        return os.path.basename(self.file.name)

views.py

documents = Document.objects.all()
return render(request, 'gridlock/upload-data.html',
              {
               'documents' : documents,
               'form': form
              })

我希望有人可以解释为什么我尝试的一切: {{ document.docfile.filename }}{{document.file.filename}}{{document.filename}}对我来说不起作用?谢谢!

1 个答案:

答案 0 :(得分:4)

我认为你与{{ document.filename }}非常接近,除了你需要改变的模型

def filename(self):
    return os.path.basename(self.file.name)

def filename(self):
    # try printing the filename here to see if it works
    print (os.path.basename(self.docfile.name))
    return os.path.basename(self.docfile.name)

在模型中,该字段称为docfile,因此您需要使用self.docfile来获取其值。

来源:django filefield return filename only in template