Esta podría ser una pregunta simple, pero de alguna manera simplemente no puedo encontrar la solución. Django ofrece mucho sobre la carga de archivos, pero ¿cómo hago para descargar un archivo?
Supongamos que tenemos un botón en HTML en uploads/something.txt como archivo.
Probé con django.views.static.serve , sin embargo, lo que hizo fue abrir un archivo en la página web.
Mi pregunta es simple: ¿Cuál es la forma mejor y más pitónica para que el usuario de nuestro sitio web descargue un archivo?
HttpResponse junto con el tipo de contenido adecuado.Aquí hay un código de muestra:
content = open("uploads/something.txt").read() return HttpResponse(content, content_type='text/plain')Esto debería servir como un archivo de texto.
Pero como usted describió, en algunos navegadores, no le pedirá que descargue el archivo, sino que lo mostrará en el navegador. Si desea mostrar un aviso de descarga, use esto:
response = HttpResponse(open("uploads/something.txt", 'rb').read()) response['Content-Type'] = 'text/plain' response['Content-Disposition'] = 'attachment; filename=DownloadedText.txt' return responseSin embargo, tenga en cuenta que podría ser una mejor idea servir contenido estático o archivos cargados a través de nginx o el proxy inverso de su elección. Enviar archivos grandes a través de Django podría no ser la forma más óptima de hacerlo.
import os from django.conf import settings from django.http import HttpResponse, Http404 def download(request, path): file_path = os.path.join(settings.MEDIA_ROOT, path) if os.path.exists(file_path): with open(file_path, 'rb') as fh: response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel") response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path) return response raise Http404Tal vez un poco tarde, pero aquí está mi solución:
def render(self, value): return format_html('<a href="/media/{0}" download>{0}</a>', value)