name - Carga de imágenes de Django simple: el archivo de imagen no se guarda
upload file django rest framework (4)
A la derecha, estoy aprendiendo cómo hacer un simple formulario de carga de imágenes para subir una imagen a MEDIA_ROOT. El formulario muestra bien, no obtengo errores, pero el archivo no se muestra en el directorio MEDIA_ROOT. Si sigo el ejemplo de la documentación y no puedo hacer que funcione, sé que es porque no he entendido correctamente la carga de archivo django. Así que aquí está mi código:
forms.py
from django import forms
class UploadImageForm(forms.Form):
image = forms.ImageField()
views.py
def merchant_image_upload(request):
if request.method == ''POST'':
form = UploadImageForm(request.POST, request.FILES)
if form.is_valid():
FileUploadHandler(request.FILES[''image''])
return HttpResponseRedirect(''/dashboard/gallery'')
else:
form = UploadImageForm()
return render_to_response(''gallery.html'', RequestContext(request, {''form'': form}))
archivo de plantilla
{% extends ''base.html'' %}
{% block main %}
<form action="{% url scvd.views.merchant_image_upload %}" method="post">{% csrf_token %}
{{ form.image }}
<input type="submit" value="Upload" />
</form>
{% endblock %}
Espero que sea suficiente información para obtener ayuda. Por favor, hágame saber qué más puedo proporcionar. Gracias, realmente aprecio la ayuda.
Para que sus archivos se carguen y se muestren en request.FILES, su formulario DEBE contener enctype = "multipart / form-data" como se muestra a continuación:
<form action="{% url scvd.views.merchant_image_upload %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.image }}
<input type="submit" value="Upload" />
</form>
No necesita adjuntarlo a un modelo como lo indica Matt S, request.FILES tiene todos los datos de la imagen si su formulario está configurado correctamente.
enctype="multipart/form-data"
asegurarse de utilizar enctype="multipart/form-data"
en su elemento, como el estado de los documentos aquí: https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded- archivos a una forma
Aparte de eso, lea los documentos sobre las cargas de archivos: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/
Todo lo que necesitas está bien documentado allí. ¡Espero que esto ayude!
EDIT OP solicitó más información sobre las cargas de archivos
De los documentos:
La mayoría de las veces, simplemente pasará los datos del archivo de la solicitud al formulario como se describe en Cómo vincular los archivos cargados a un formulario. Esto se vería algo así como:
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == ''POST'':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES[''file''])
return HttpResponseRedirect(''/success/url/'')
else:
form = UploadFileForm()
return render_to_response(''upload.html'', {''form'': form})
Y tienen un ejemplo de cómo se puede escribir la función handle_uploaded_file
:
def handle_uploaded_file(f):
destination = open(''some/file/name.txt'', ''wb+'')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
Debe adjuntarlo a un modelo (como un ImageField ) ya que no se guardará en ningún momento. Se puede manejar sin ningún problema en este momento, pero se descarta después de que la vista regrese.
No importa, no me di cuenta de que los modelos eran innecesarios.
Encontré esta increíble respuesta para quien esté buscando: https://.com/a/8542030
Contiene un proyecto django simple completo para cargar archivos.