2012-08-08 6 views
6

üretir. Tüm dosyalar şablonundaDjango: - Dosyaya dosya sistemindeki yolunu ben <code>File</code><code>path</code> alan saklamak modeli var indirme bağlantısını

Ben File nesnesi için indirme bağlantısını oluşturmak istediğiniz MEDIA_ROOT/dosyalarında saklanır. Bunu yapmanın en iyi yolu nedir? Django'da statik dosya işleme kullanmalı mıyım?

TIA!

UPD

File modeli öğesinin Görünüm olarak

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) 

Ben aşağıdakileri yapın:

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

ve şablona geçiş files

şablonda

Ben mesela files.1.file.url kullanmak ve hala site.com/home/dizpers/...

UPD2

Related question

Çözüm gibi kötü url var

Benim sorunum file alanında, Dosya modelinde oldu. upload_to parametresinde mutlak yolunu kullanmak, ancak göreli yolu kullanmalıdır:

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

cevap

7

Ben tam olarak "indirme bağlantısı oluşturmak" ile ne demek emin değilim, ama sadece dosyaya bağlanmak için, sadece {{ some_file.url }} kullanmak href olarak.

+0

Ve bu benim özel File nesnesinin çalışacak? Django'nun File nesnesi değil. – dizpers

+0

Denedim. Çalışmıyor. hala site.com/home/dizpers/data/......./file.pdf gibi url'leri alırsınız 'ev/dizpers/...' diskin – dizpers

+0

üzerindeki dosya yoludur. Dosya 'modeli hala FileField' 'gerçek-mavi yerine sadece standart' CharField' kullanılmamıştır.Her ikisi de veritabanında aynı şekilde saklandığı için, gerçekten de hiçbir sebep yok; 'FileField' sadece I/O ile ilgilenmek için eklenmiş bir API'ye sahiptir. Yine de, sadece çok basit bir bağlantıya ihtiyacınız varsa '{{MEDIA_URL}} dosyalarını/{{file_instance.path}}' kullanabilirsiniz. –

3

models.py yılında kullanıcı tarafından yüklenen içerik

4

için href="{{ STATIC_URL }}/files/somefile" veya href="{{ MEDIA_URL }}/files/somefile" kullanmayı deneyin:

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) 

sizin file_detail.html (veya eşdeğeri olarak

(self.path değerinden MEDIA_ROOT şerit the relpath method kullanarak)) şablonu:

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

NB, Chris'in dediği gibi, burada FileField'u kullanmak daha iyidir. Yukarıda umarım tam durum için çalışacaktır, ancak şeyler bu şekilde düzenlenmesi derinden bağlı olmadıkça, Bana ayrılmış alana değişen öneririm.