2015-10-12 13 views
11

Sono un po 'confuso su quale campo utilizzare. Quello che mi serve è solo un campo che manterrà un file (audio e/o un altro per un'immagine)Per utilizzare Django FileField o FilePathField?

Il FileField sembra essere specificamente per il caricamento e penso che sia un po 'eccessivo per quello che mi serve, io Inoltre, non mi piace come caricherà e rinomerà automaticamente i file con un nome file univoco (file_FHjgh758.txt) ogni volta che viene caricato qualcosa.

Il problema che ho con il FilePathField è che sembra richiedere un percorso assoluto, che sarebbe ovviamente diversa da dev per la produzione, ho avuto intorno a questo con l'aggiunta di questo al modello ...

import os 

class Foo(models.Model): 

    path = os.path.dirname(os.path.dirname(__file__)) 
    path = os.join(path, 'media') 
    audio = models.FilePathField(path=path) 

Non ho idea se questo è sicuro o corretto, e non ci sono molti esempi online o nei documenti da cui attingere.

Per essere chiari, voglio solo avere un campo in cui posso puntare a un file (audio o immagine) da qualche parte nel mio sistema. Quale sarebbe il modo migliore per farlo?

risposta

11

Se si desidera fare riferimento a file già presenti nel proprio file system anziché a file caricati dall'utente, è possibile specificare FilePathField.

A questo proposito un paio di osservazioni:

  • fare non punto a un percorso che si trova all'interno struttura di origine della tua app. Non è sicuro.

  • È possibile utilizzare le impostazioni o variabili di ambiente per gestire lo sviluppo vs. percorsi di produzione, ad esempio, mettere un ambiente FILE_PATH_FIELD_DIRECTORY nei file di sviluppo/impostazioni di produzione e si riferiscono a questa impostazione dalla tua app:

    from django.conf import settings 
    
    class Foo(models.Model): 
        audio = models.FilePathField(path=settings.FILE_PATH_FIELD_DIRECTORY) 
    
+1

grazie per la risposta, questo ha senso per me anche se sono bloccato su come chiamare il percorso del file da un modello. Se chiamo l'url salvato nel db è qualcosa come '/home/../../' e l'html prova a renderlo relativo al server dev che non è corretto. Penso che mi manca qualcosa di ovvio qui – deltaskelta

+2

Penso che il problema è che "FilePathField" è inteso più per i file che si trovano sul tuo server che non sono accessibili attraverso il server web ... se vuoi file pubblici, allora stai meglio usando 'FileField' che ha un attributo' url' e che salverà anche i file in un posto accessibile (nel tuo 'MEDIA_ROOT'). È possibile sovrascrivere il comportamento di salvataggio di 'FileField' per impedire il suffisso casuale. – solarissmoke

+1

Grazie per il follow-up, se non sbaglio dovrei anche inserire una voce in urls.py e una vista per gestire le richieste che arrivano nella cartella/media? È corretto o è anche pericoloso? – deltaskelta

Problemi correlati