2010-01-17 5 views
11

Comment obtenir la taille et le nom d'un objet FileField dans un modèle?Taille et nom de FileField dans le modèle

Mon modèle est configuré comme ceci:

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

Mon modèle est configuré comme ceci:

{% 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 %} 

Comment puis-je afficher le nom du fichier et la taille?

Répondre

29

Une fois que vous avez accès à la valeur d'un FileField, vous avez une valeur de type File, qui a les méthodes suivantes:

File.name: Le nom du fichier, y compris le chemin relatif de MEDIA_ROOT .

File.size La taille du fichier en octets.

Vous pouvez le faire dans votre modèle:

{% 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 %} 

Pour obtenir une taille du fichier plus lisible par l'homme (pour ceux de vos utilisateurs qui seraient confus en voyant 64,5 Mo comme 67633152 octets - je les appelle wusses), alors vous pourriez être intéressé par le filtre filesizeformat, pour transformer la taille en octets dans des choses comme 13 KB, 4.1 MB, 102 bytes, etc, que vous utilisez dans votre modèle comme celui-ci:

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

+1, mais voulez-vous pour développer "Une fois que vous avez g ot accès à la valeur d'un 'FileField', vous avez une valeur de type' File' "? Lorsque vous travaillez avec une instance de 'FileField' comme ci-dessus (avec' download.file'), comment vous trouvez-vous magiquement avec une instance de 'File' à la place? Je vois beaucoup de ce genre de choses avec Django. Cela peut être déroutant. Et si vous pouviez pointer vers une documentation pour cela, ce serait utile. Merci. –

+0

Peut-être ce lien [Référence du champ Modèle Django: Types de champs] (http://docs.djangoproject.com/fr/1.2/ref/models/fields/#field-types), qui indique "Lorsque vous accédez à un FileField sur un modèle, vous recevez une instance de FieldFile en tant que proxy pour accéder au fichier sous-jacent. " est pertinent. Je pense toujours que c'est magique. –

Questions connexes