Archivo de descarga de Django
Este artículo muestra cómo crear un sitio web donde el administrador puede cargar un archivo y hacer que el usuario descargue un archivo desde una página web en Django.
Subir y descargar un archivo en Django
Vayamos a la terminal y creemos un proyecto de demostración para demostrárselo. Siga los comandos para crear un proyecto Django y una aplicación en ese proyecto.
django-admin startproject django_project
python manage.py startapp blog
Abramos este proyecto Django recién creado en el editor de texto disponible.
Primero crearemos una carpeta para nuestros archivos cargados, así que abramos settings.py
. Busque la lista INSTALLED_APPS
y pase el nombre de la aplicación como elemento.
INSTALLED_APPS = [
"blog.apps.BlogConfig",
]
Ahora necesitamos crear una carpeta donde se cargarán los archivos. Busque la variable STATIC_URL
y escriba el siguiente código debajo de la variable.
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
Ahora necesitamos configurar nuestra MEDIA_URL
igual a '/media/'
y luego configurar MEDIA_ROOT
, que sería el nombre de la carpeta donde se guardarán los archivos cargados.
MEDIA_ROOT = os.path.join(BASE_DIR, "media_cdn")
Ahora agreguemos nuestras reglas estáticas y de medios a urls.py
. Definamos la ruta para las funciones inicio
y descarga
que extraerán del archivo views.py
.
También vamos a establecer la URL para el archivo de descarga.
No podemos usar el objeto url
porque está en desuso. Entonces, en lugar de esto, podemos usar fácilmente el objeto re_path
.
re_path(r"^download/(?P<path>.*)$", serve, {"document_root": settings.MEDIA_ROOT})
En nuestro caso, estamos usando este código.
Vamos a crear nuestro modelo dentro del archivo models.py
, y en este modelo tendremos dos campos. El primer campo sería un FileField
, y el segundo sería CharField
.
También necesitamos crear un método string dunder para devolver el título de la página.
Necesitamos registrar nuestro modelo FilesAdmin
en el archivo admin.py
.
from .models import FilesAdmin
admin.site.register(FilesAdmin)
Crearemos un archivo home.html
dentro de las plantillas del blog dentro de la carpeta del blog. Agreguemos el siguiente código en el archivo home.html
entre la etiqueta del cuerpo.
{% for post in file %}
<h2>{{post.title}}</h2>
<a href="{{post.adminupload.url}}" download="{{post.adminupload.url}}">Download</a>
{% endfor %}
Obtendremos todos los objetos del modelo FilesAdmin
en la función home
. Luego pase el contexto en el archivo home.html
y renderice esta página.
Necesitamos definir nuestras funciones de inicio
y descarga
en el archivo views.py
. La ruta la obtendremos en la función descargar
, donde se descargará el archivo por defecto.
En la siguiente línea, comprobaremos si el directorio existe o no. Luego abriremos un archivo en modo binario de lectura y lo devolveremos en la respuesta HTTP.
from django.http import HttpResponse, Http404
from django.conf import settings
import os
from django.shortcuts import render
from requests import Response
from .models import FilesAdmin
def home(request):
# get all objects
OUR_CONTEXT = {"file": FilesAdmin.objects.all()}
return render(request, "blog/home.html", OUR_CONTEXT)
def download(request, path):
# get the download path
download_path = os.path.join(settings.MEDIA_ROOT, path)
if os.path.exists(download_path):
with open(download_path, "rb") as fh:
response = HttpResponse(fh.read(), content_type="application/adminupload")
response["Content-Disposition"] = "inline; filename=" + os.path.basename(
download_path
)
return response
raise Http404
Ahora necesitamos hacer la migración ejecutando estos comandos.
python manage.py makemigrations
python manage.py migrate
Crea un superusuario.
python manage.py createsuperuser
Ejecutemos el servidor Django e intentemos cargar un archivo mp3 desde el panel de administración.
Abramos la página de inicio y veamos si podemos descargarlo o no.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn