web-dev-qa-db-fra.com

Django FileField: comment renvoyer le nom de fichier uniquement (dans le modèle)

J'ai un champ dans mon modèle de type FileField . Cela me donne un objet de type File , qui a la méthode suivante:

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

Ce que je veux, c'est quelque chose comme ".filename "qui ne me donnera que le nom du fichier et non le chemin aussi, quelque chose comme:

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

Ce qui donnerait quelque chose comme myfile.jpg

55
John

Dans la définition de votre modèle:

import os

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

    def filename(self):
        return os.path.basename(self.file.name)
122
Ludwik Trammer

Vous pouvez le faire en créant un filtre de modèle:

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

Et puis dans votre modèle:

{% load filename %}

{# ... #}

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

Vous pouvez accéder au nom de fichier à partir de l'objet champ de fichier avec la propriété name.

class CsvJob(Models.model):

    file = models.FileField()

alors vous pouvez obtenir le nom de fichier des objets particuliers en utilisant.

obj = CsvJob.objects.get()
obj.file.name property
0
DeadDjangoDjoker