2010-04-21 15 views
43

Mam pole w moim modelu typu FileField. Daje mi to obiekt typu pliku File, który ma następującą metodę:plik pola django zwróć nazwę pliku tylko w szablonie

File.name: nazwa pliku wraz ze ścieżką względną z MEDIA_ROOT.

Co chcę jest coś .filename że będzie tylko dać mi nazwę pliku, a nie ścieżkę oraz

coś takiego:

{% for download in downloads %} 
    <div class="download"> 
     <div class="title">{{download.file.filename}}</div> 
    </div> 
{% endfor %} 

co dałoby coś podobnego myfile.jpg

dziękuje

Odpowiedz

95

W definicji modelu:

import os 

class File(models.Model): 
    file = models.FileField() 
    ... 

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

działał świetnie, ale potrzebował, aby parametr został przekazany do systemu BASE jako self.file.name. Myślę, że potrzebuje tego, ponieważ self.file jest obiektem pliku, a nie ciągiem do pliku. – John

+0

Dzięki. Zaktualizowałem post. –

+3

dodanie dekoratora @property pozwala uniknąć wywoływania file.filename() i po prostu file.filename może być używany – spedy

35

Można to zrobić poprzez stworzenie filtru szablonu:

W myapp/templatetags/filename.py:

import os 

from django import template 


register = template.Library() 

@register.filter 
def filename(value): 
    return os.path.basename(value.file.name) 

a potem w szablonie:

{% load filename %} 

{# ... #} 

{% for download in downloads %} 
    <div class="download"> 
     <div class="title">{{download.file|filename}}</div> 
    </div> 
{% endfor %} 
+0

Jest to również przyjemne podejście. Być może trochę bardziej przenośny? – Flowpoke

+0

Fajne dzięki i zastosowałem – soField

+2

Podczas pisania filtra powinno być {{download | filename}} –

0

można uzyskać dostęp do pliku z pola pliku obiekt z właściwością name.

class CsvJob(Models.model): 

    file = models.FileField() 

następnie można uzyskać nazwę pliku poszczególnych obiektów za pomocą.

obj = CsvJob.objects.get() 
obj.file.name property 
Powiązane problemy