2012-08-08 14 views
6

Mam model File, który przechowuje ścieżkę path w systemie plików do pliku. Wszystkie pliki są przechowywane w pliku MEDIA_ROOT/filesDjango: generuj łącze pobierania

W szablonie chcę wygenerować łącze pobierania dla obiektu File. Jaki jest najlepszy sposób na zrobienie tego? Czy należy używać obsługi plików statycznych w django?

TIA!

UPD

File modelu

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) 

W widoku elementu I wykonaj następujące czynności:

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

i podanie files do szablonu

w szablonie używam files.1.file.url na przykład i nadal mają złe url jak site.com/home/dizpers/...

UPD2

Related question

Rozwiązanie

Mój problem był w modelu pliku, w file dziedzinie. W parametrze upload_to użyć ścieżki bezwzględnej, ale musi użyć ścieżki względnej:

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

Odpowiedz

7

Nie jestem pewien, co dokładnie masz na myśli przez „wygenerować link do pobrania”, ale po prostu nie odwołuje się do pliku, wystarczy użyć {{ some_file.url }} jako Twój href.

+0

I będzie działać dla mojego niestandardowego obiektu File? Nie obiekt pliku django. – dizpers

+0

Próbowałem. Nie działa. nadal dostaję adresy URL takie jak site.com/home/dizpers/data/......./file.pdf gdzie 'home/dizpers/...' jest ścieżką do pliku na dysku – dizpers

+0

Zakładałem, że twoje ' Model pliku nadal wykorzystywał prawdziwy niebieski "FileField" zamiast zwykłego 'CharField'.Naprawdę nie ma powodu, aby tego nie robić, ponieważ oba są przechowywane w ten sam sposób w bazie danych; 'FileField' ma po prostu API do obsługi operacji we/wy. Niemniej jednak, jeśli potrzebujesz bardzo prostego linku, możesz użyć plików '{{MEDIA_URL}}/{{file_instance.path}}'. –

3

spróbuj href="{{ STATIC_URL }}/files/somefile" lub href="{{ MEDIA_URL }}/files/somefile" do przesłanego użytkownik zawartości

4

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

(używając the relpath method rozebrać MEDIA_ROOT od wartości self.path)

w twojej file_detail.html (lub równoważny) Szablon:

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

NB jak mówi Chris, lepiej użyć tutaj FileField. Powyższe, mam nadzieję, zadziała w twojej dokładnej sytuacji, ale jeśli nie jesteś głęboko zaangażowany w organizowanie tego w ten sposób, sugeruję zmianę na dedykowane pole.