2010-01-17 15 views
11

¿Cómo obtengo el tamaño y el nombre de un FileField en una plantilla?Tamaño y nombre de FileField en la plantilla

Mi modelo es configuración como esta:

class PDFUpload(models.Model): 
    user = models.ForeignKey(User, editable=False) 
    desc = models.CharField(max_length=255) 
    file = models.FileField(upload_to=upload_pdf) 

Mi plantilla está configurada como esto:

{% for download in downloads %} 
    <div class="download"> 
     <div class="title"> Name</div> 
     <div class="size">64.5 MB</div> 
     <div class="desc">{{download.desc}}</div> 
    </div> 
{% endfor %} 

¿Cómo puedo mostrar el nombre y el tamaño del archivo?

Respuesta

29

Una vez que tenga acceso al valor de un FileField, usted tiene un valor de tipo File, que tiene los siguientes métodos:

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

File.size El tamaño del archivo en bytes.

Así que usted puede hacer esto en su plantilla:

{% for download in downloads %} 
    <div class="download"> 
     <div class="title">{{download.file.name}}</div> 
     <div class="size">{{download.file.size}} bytes</div> 
     <div class="desc">{{download.desc}}</div> 
    </div> 
{% endfor %} 

Para obtener un tamaño de archivo más legible (para aquellos de sus usuarios que se confunde al ver 64.5 MB como 67633152 bytes - Los llamo wusses), entonces usted puede estar interesado en el filtro filesizeformat, para convertir tamaños en bytes en cosas como 13 KB, 4.1 MB, 102 bytes, etc, que se utiliza en la plantilla de la siguiente manera:

<div class="size">{{download.file.size|filesizeformat}}</div> 
+0

+1, pero ¿le importaría para expandir "Una vez que hayas ot acceso al valor de un 'FileField', tienes un valor de tipo' File'? Cuando trabajas con una instancia de 'FileField' como la anterior (con' download.file'), ¿cómo te encuentras mágicamente con una instancia de 'File'? Veo bastante de este tipo de cosas con Django. Puede ser confuso Y si pudieras señalar cualquier documentación para esto, sería útil. Gracias. –

+0

Posiblemente este enlace [referencia de campo del modelo Django: tipos de campo] (http://docs.djangoproject.com/en/1.2/ref/models/fields/#field -types), que dice "Cuando accede a un campo de archivos en un modelo, se le da una instancia de FieldFile como un proxy para acceder al archivo subyacente ". es relevante. Aún así creo que es mágico. –

Cuestiones relacionadas