django - 如何在模板中插入上传文件的内容?

时间:2014-01-10 14:24:52

标签: python django django-templates

说我在FileField中存储了一个文本文件。现在我想在网页上显示其内容。我阅读了django模板文档,但没有找到办法。

我当然可以在我的观看中content = f.read()并将content传递给模板。有没有更好的办法?谢谢!

better way意味着我可以通过将MyModel.objects.all()传递给模板来完成工作。我不能read模板中的文件,但应该存在某种黑客攻击。

修改
我试过了:

def display_html(self):
    content = self.html_file.read()
    print(content)
    return content

但没有显示......

最终修改
下面的代码工作非常奇怪

class MyModel(models.Model):
    name = models.CharField()
    text = models.FileField()

    def display_text_file(self):
        fp = open(self.text.path)
        return fp.read().replace('\n', '<br>')

然而,我认为相同的东西不起作用:

class MyModel(models.Model):
    name = models.CharField()
    text = models.FileField()

    def display_text_file(self):
        return self.text.read().replace('\n', '<br>')
        # neither do self.text.read().decode().replace('\n', '<br>')

我真的想知道原因。

1 个答案:

答案 0 :(得分:7)

如果您要为FileField read方法执行FileField以上的方法,则可以为您的班级定义display_text_file的方法,例如class MyModel(models.Model): name = models.CharField(max_length=100) text = models.FileField(max_length=100, upload_to='.') def display_text_file(self): with open(self.text.path) as fp: return fp.read().replace('\n', '<br>') ,然后在模板中调用它。

型号:

def show_files(request):
    objects = MyModel.objects.all()
    return render_to_response('show_files.html', {'objects': objects},
                              context_instance=RequestContext(request))

查看:

{% for obj in objects %}

 <p>
   file name: {{obj.name}} <br>
   file content: {{obj.display_text_file}}
 </p>

{% endfor %}

模板:

display_text_file

有关打开文件的方法,在def display_text_file(self): with open(self.text.path) as fp: return fp.read().replace('\n', '<br>') def display_text_file(self): self.text.open() # reset the pointer of file, needs if you need to read file more than once, in a request. return self.text.read().replace('\n', '<br>') def display_text_file(self): self.text.open() # reset the pointer of file, needs if you need to read file more than once, in a request. return self.text.file.read().replace('\n', '<br>') 中,所有这些方法都适用于我:

self.text

django.db.models.fields.files.FieldFile的类型为['DEFAULT_CHUNK_SIZE', 'chunks', 'close', 'closed', 'delete', 'encoding', 'field', 'file', 'fileno', 'flush', 'instance', 'isatty', 'multiple_chunks', 'name', 'newlines', 'open', 'path', 'read', 'readinto', 'readline', 'readlines', 'save', 'seek', 'size', 'softspace', 'storage', 'tell', 'truncate', 'url', 'write', 'writelines', 'xreadlines'] 并具有以下方法:

self.text.file

django.core.files.base.File的类型为['DEFAULT_CHUNK_SIZE', 'chunks', 'close', 'closed', 'encoding', 'file', 'fileno', 'flush', 'isatty', 'mode', 'multiple_chunks', 'name', 'newlines', 'open', 'read', 'readinto', 'readline', 'readlines', 'seek', 'size', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines'] 并具有以下方法:

read

他们都有{{1}}方法。