2014-01-10 5 views
4

Скажем, я сохранил текстовый файл в FileField. Теперь я хочу отобразить его содержимое на веб-странице. Я прочитал документ шаблона django, но не нашел способ сделать это.django - Как вставить содержимое загруженного файла в шаблон?

Конечно, я могу сделать content = f.read() в моих взглядах и пройти content к шаблону. Есть ли способ лучше? Спасибо!

better way означает, что я мог бы выполнить эту работу, передав MyModel.objects.all() шаблону. Я не могу создать файл в шаблоне, но для этого должны быть какие-то хаки.

редактировать
Я пробовал:

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, если вы хотите сделать больше, чем 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

Использовал ли 'replace ('\ n', '
')' для вас? – laike9m

+0

humm, наконец, это работает. Наверное, нет другого способа добиться этого, в любом случае спасибо! – laike9m

+0

Ну, последнее редактирование 'fp = open (self.html_file.path); return fp.read(). Replace ('\ n', '
')' работает, но 'self.text.file.read(). Replace ('\ n', '
') 'does not. – laike9m

Смежные вопросы