Django se envía con la clase FileSystemStorage que ayuda a almacenar archivos localmente para que estos archivos puedan servir como medios en desarrollo. En este artículo, veremos cómo implementar un sistema de carga de archivos usando la API FileSystemStorage para almacenar los archivos localmente.
Nota: Este método solo debe usarse en desarrollo y no en producción.
¿Cómo cargar archivos con FileSystemStorage?
- Paso 1 : Comenzaremos creando un formulario de plantilla para cargar archivos.
Modelo
HTML
<form method = 'POST' class="col s12" enctype="multipart/form-data"> {% csrf_token %} {{new_form.as_p}} <!--Below is our main file upload input --> <input type = "file" name = 'document'> <p><button type = "submit" class = "waves-effect waves-light btn" style = "background-color: teal">Publish</button></p> </form>
- Aquí, tenga en cuenta que la entrada (a través de la cual el usuario puede ingresar un archivo) tiene el nombre de ‘documento’.
- Paso 2: Ahora, escribiremos la vista para el mismo en el archivo `views.py`
Vista
Primero, importe la clase FileSystemStorage en la parte superior del archivo usando
from django.core.files.storage import FileSystemStorage
Python3
if request.method == "POST": # if the post request has a file under the input name 'document', then save the file. request_file = request.FILES['document'] if 'document' in request.FILES else None if request_file: # save attached file # create a new instance of FileSystemStorage fs = FileSystemStorage() file = fs.save(request_file.name, request_file) # the fileurl variable now contains the url to the file. This can be used to serve the file when needed. fileurl = fs.url(file) return render(request, "template.html")
- Aquí, el constructor de la clase FileSystemStorage toma el parámetro ‘ubicación’, que es la ruta al directorio donde desea almacenar los archivos. Por defecto, es la ruta en la variable ‘settings.MEDIA_ROOT’. También toma el parámetro ‘base_url’, que es la URL a la que desea que correspondan los medios. De forma predeterminada, se establece en el valor de la variable ‘settings.MEDIA_URL’ (asegúrese de tener esas constantes configuradas en el archivo settings.py).
La función FileSystemStorage.save toma 3 argumentos; nombre, contenido (el archivo en sí) y max_length (valor predeterminado = Ninguno).
Esta función almacena el archivo – ‘contenido’ bajo el nombre ‘nombre’. Si existe un archivo con el mismo nombre, modifica un poco el nombre del archivo para generar un nombre único.
Lea sobre más parámetros y métodos de construcción de la clase FileSystemStorage en la documentación de Django para el mismo
- Paso 3: defina MEDIA_ROOT y MEDIA_URL si aún no se han definido.
Configuración
Asegúrese de configurar MEDIA_ROOT y MEDIA_URL en settings.py.
Python3
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # media directory in the root directory MEDIA_URL = '/media/'
- Paso 4: Finalmente, agregamos una ruta a MEDIA_URL.
URL
en urls.py, importar
from django.conf.urls.static import static from django.conf import settings
- y agregue lo siguiente al final del archivo
Python3
# only in development if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
- Esto agregará una ruta a MEDIA_URL y servirá el archivo desde MEDIA_ROOT cuando un usuario realice una solicitud GET a MEDIA_URL/(nombre de archivo). Una vez hecho todo esto, los archivos cargados deberían aparecer en el directorio especificado en la constante MEDIA_ROOT.
Salida:
la interfaz debería verse así
Como se mencionó anteriormente, este método solo debe usarse para servir medios en desarrollo y no en producción. Es posible que desee utilizar algo como nginx en producción.