2012-08-08 29 views
6

Tengo un modelo File, que almacena path campo - ruta en el sistema de archivos del archivo. Todos los archivos se almacenan en MEDIA_ROOT/filesDjango: generar enlace de descarga

En la plantilla quiero generar el enlace de descarga para el objeto File. ¿Cuál es la mejor manera de hacer esto? ¿Debo usar el manejo de archivos estáticos en django?

TIA!

UPD

File modelo

class File(models.Model): 
    item = models.ForeignKey(Item) 
    file = models.FileField(upload_to = os.path.join(MEDIA_ROOT,'items')) 
    format = models.CharField(max_length = 255) 

En opinión del artículo que haga lo siguiente:

files = File.objects.filter(item_id = id)

y el pase a la plantilla files

en la plantilla que utilice files.1.file.url por ejemplo, y todavía tienen mala URL como site.com/home/dizpers/...

UPD2

Related question

Solución

Mi problema era en el modelo de archivos, en file campo. En el parámetro upload_to utilizo ruta absoluta, sino que debe utilizar la ruta relativa:

file = models.FileField(upload_to = 'items')

Respuesta

7

No estoy seguro de qué es exactamente lo que quiere decir con "generar enlace de descarga", sino simplemente enlazar con el archivo, sólo tiene que utilizar {{ some_file.url }} como su href.

+0

Y funcionará para mi objeto de archivo personalizado? No es el objeto de archivo de django. – dizpers

+0

Lo probé. No funciona aún obtener URL como site.com/home/dizpers/data/......./file.pdf donde 'home/dizpers/...' es la ruta al archivo en el disco – dizpers

+0

Estaba asumiendo que su ' El modelo de archivo todavía utilizaba un 'FileField' verdadero azul en lugar de un' CharField' estándar.Realmente no hay razón para no hacerlo, ya que ambos se almacenan de la misma manera en la base de datos; 'FileField' solo tiene una API adjunta para tratar con E/S. Sin embargo, si solo necesitas un enlace muy básico, puedes usar '{{MEDIA_URL}} archivos/{{file_instance.path}}'. –

3

intente utilizar href="{{ STATIC_URL }}/files/somefile", o href="{{ MEDIA_URL }}/files/somefile" para el usuario subido contenido

4

En models.py:

import os 

from django.conf import settings 
from django.db import models 

class File(models.Model): 
    ... (your existing File model) 

    @property 
    def relative_path(self): 
     return os.path.relpath(self.path, settings.MEDIA_ROOT) 

(usando the relpath method para despojar MEDIA_ROOT a partir del valor de self.path)

En su file_detail.html (o equivalente) plantilla:

<a href='{{ MEDIA_URL }}{{ file.relative_path }}'>{{ file.name }}</a> 

NB como dice Chris, es mejor usar un FileField aquí. Lo anterior funcionará con suerte para su situación exacta, pero a menos que esté profundamente comprometido con las cosas de esa manera, le sugiero que cambie al campo dedicado.

Cuestiones relacionadas