2014-01-10 95 views
4

假設我在FileField中存儲了一個文本文件。現在我想在網頁上顯示其內容。我閱讀了django模板文檔,但沒有找到辦法做到這一點。django - 如何在模板中插入上傳文件的內容?

當然我可以在我的意見中做content = f.read()並將content傳遞給模板。有沒有更好的辦法?謝謝!

better way意味着我可以通過將MyModel.objects.all()傳遞給template.I不能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>') 

我真的很想知道原因。

+0

您可以創建自己的小部件並覆蓋render()方法,但是您也必須閱讀該文件。見https://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.render – gawel

+0

@gawel謝謝,我現在要讀它 – laike9m

+0

@gawel這不是我所需要的假設... – laike9m

回答

5

可以定義爲類有FileField,如果你想要做的FileField超過read方法做,例如用於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

'替換('\ n','
')'爲你工作嗎? – laike9m

+0

humm,最後這個工程。我想沒有其他辦法可以做到這一點,反正謝謝! – laike9m

+0

你上次編輯'fp = open(self.html_file.path); return fp.read()。replace('\ n','
')'works but'self.text.file.read()。replace ('\ n','
')'不。 – laike9m