Django: générer un lien de téléchargement
J'ai un File
modèle, qui stockent path
champ chemin d'accès dans le système de fichiers pour fichier. Tous les fichiers sont stockés dans MEDIA_ROOT/fichiers
Dans le modèle que je veux générer un lien de téléchargement pour File
objet. Quelle est la meilleure façon de le faire? Dois-je utiliser statique de la gestion des fichiers dans django?
TIA!
UPD
File
modèle
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)
Au point de Vue je ne les suivants:
files = File.objects.filter(item_id = id)
et le col files
pour le modèle
modèle-je utiliser files.1.file.url
par exemple et ont encore une mauvaise url, comme site.com/home/dizpers/...
UPD2
Solution
Mon problème était dans le Fichier de modèle, dans file
champ. Dans upload_to paramètre-je utiliser le chemin absolu, mais doit utiliser un chemin relatif:
file = models.FileField(upload_to = 'items')
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr exactement ce que vous voulez dire par "générer le lien de téléchargement", mais simplement un lien vers le fichier, il suffit d'utiliser
{{ some_file.url }}
que votrehref
.home/dizpers/...
est le chemin vers le fichier sur le disqueFile
modèle utilisé un vrai bleuFileField
au lieu de seulement un standardCharField
. Il n'y a vraiment aucune raison de ne pas, comme les deux sont stockées de la même manière dans la base de données;FileField
juste a une API connecté pour traiter avec les I/O. Néanmoins, si vous avez juste besoin d'une très simple lien, vous pouvez utiliser{{ MEDIA_URL }}files/{{ file_instance.path }}
.MEDIA_ROOT
partie de la voie d'abord (via une méthode sur votre modèle le plus probable), puis les attacherMEDIA_URL
.Dans
models.py
:(à l'aide de le
relpath
méthode à la bandeMEDIA_ROOT
à partir de la valeur deself.path
)Dans votre
file_detail.html
(ou l'équivalent) modèle:NB comme Chris le dit, il est préférable d'utiliser une
FileField
ici. La ci-dessus sera, espérons-le travail de votre situation exacte, mais à moins que vous êtes profondément attaché à arranger les choses de cette façon, je te suggère de modifier le champ dédié.essayez d'utiliser
href="{{ STATIC_URL }}/files/somefile"
, ouhref="{{ MEDIA_URL }}/files/somefile"
pour l'utilisateur de télécharger du contenu