2012-11-19 15 views
5

Ho modello come questo:Ottenere estensione del file nel modello di Django

class File(models.Model): 
    name = models.CharField(max_length=45) 
    description = models.CharField(max_length=100, blank=True) 
    file = models.FileField(upload_to='files') 

ricevo tutti gli oggetti di file in mio punto di vista e in base al tipo di file, vorrei stampare appropriata una classe:

<a class="pdf">link</a> 

o

<a class="word">link</a> 

o

<a class="other">link<a/> 

nel mio modello.

Come posso ottenere l'estensione del file nel modello Django?

vorrei fare somethink in questo modo:

{% for file in files %} 
    {% if file.get_extension == 'pdf' %} 
      <a class="pdf">link</a> 
    {% elif file.get_extension = '.doc' %} 
      <a class="word">link</a> 
    {% else %} 
      <a class="other">link<a/> 
    {% endif %} 
{% endfor %} 

Naturalmente, 'file.get_extension' non esiste ...

risposta

17

vi state perdendo un .get_extension sul vostro modello? È facile, basta aggiungerlo :-) Puoi avere tutti i tipi di metodi su un modello. Quindi, qualcosa di simile:

class File(models.Model): 
    name = models.CharField(max_length=45) 
    description = models.CharField(max_length=100, blank=True) 
    file = models.FileField(upload_to='files') 

    def extension(self): 
     name, extension = os.path.splitext(self.file.name) 
     return extension 

(Il nome .extension() è più divinatorio di .get_extension(), btw).

Puoi andare ancora oltre. Non è questo se/else struttura un po 'noioso nel tuo modello? Si tratta di meno di un fastidio in codice Python:

class File(models.Model): 
    ... 
    def css_class(self): 
     name, extension = os.path.splitext(self.file.name) 
     if extension == 'pdf': 
      return 'pdf' 
     if extension == 'doc': 
      return 'word' 
     return 'other' 

Il modello è più semplice in questo modo:

{% for file in files %} 
    <a class="{{ file.css_class }}">link</a> 
{% endfor %} 
2

Non so se v'è un ingegnoso costruito in funzione di Django per fare questo, ma è possibile ottenere l'estensione dal filefield

fileName, fileExtension = os.path.splitext(file.name)

Se si sta insieme a fare questo nel modello è possibile creare un tag personalizzato che avvolge questo

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Problemi correlati