Archivo de descarga de Django

Salman Mehmood 15 febrero 2024
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.

Subir y descargar un archivo en Django

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.

Subir y descargar un archivo en Django 2

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.

Subir archivo MP3 en Django

Abramos la página de inicio y veamos si podemos descargarlo o no.

Descargar un archivo en Django

Salman Mehmood avatar Salman Mehmood avatar

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