2010-04-21 12 views
43

Tengo un campo en mi modelo de tipo FileField. Esto me da un objeto de tipo tipo Archivo, que tiene el siguiente método:django filefield return filename filename solo en la plantilla

File.name: El nombre del archivo incluye la ruta relativa desde MEDIA_ROOT.

Lo que quiero es algo así como .FileName que sólo me dará el nombre de archivo y no el camino, así

algo como:

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

lo que daría algo así como myfile.jpg

gracias

Respuesta

95

En la definición de su modelo:

import os 

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

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

funcionó muy bien, pero necesitaba el parámetro que se pasa al nombre del archivo como self.file.name. Creo que necesita esto como self.file es un objeto de archivo en lugar de la cadena del archivo. – John

+0

Gracias. Actualicé la publicación. –

+3

agregando el @property decorator evita llamar a file.filename() y simplemente file.filename se puede usar – spedy

35

Usted puede hacer esto mediante la creación de un filtro de plantilla:

En 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) 

Y luego en su plantilla:

{% load filename %} 

{# ... #} 

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

Este es también un buen enfoque. Tal vez un poco más portátil? – Flowpoke

+0

genial gracias, apliqué – soField

+2

Como escribió el filtro, debería ser {{descargar | nombre de archivo}} –

0

Se puede acceder al nombre de archivo en el campo Archivo objeto con la propiedad del nombre.

class CsvJob(Models.model): 

    file = models.FileField() 

entonces puede obtener el nombre de archivo de los objetos particulares utilizando.

obj = CsvJob.objects.get() 
obj.file.name property 
Cuestiones relacionadas