Django - Carga de archivos
Generalmente es útil que una aplicación web pueda cargar archivos (foto de perfil, canciones, pdf, palabras ...). Analicemos cómo cargar archivos en este capítulo.
Subiendo una imagen
Antes de comenzar a jugar con una imagen, asegúrese de tener instalada la Biblioteca de imágenes de Python (PIL). Ahora, para ilustrar la carga de una imagen, creemos un formulario de perfil, en nuestro myapp / forms.py -
#-*- coding: utf-8 -*-
from django import forms
class ProfileForm(forms.Form):
name = forms.CharField(max_length = 100)
picture = forms.ImageFields()
Como puede ver, la principal diferencia aquí es solo el forms.ImageField. ImageField se asegurará de que el archivo cargado sea una imagen. De lo contrario, la validación del formulario fallará.
Ahora creemos un modelo de "Perfil" para guardar nuestro perfil cargado. Esto se hace en myapp / models.py -
from django.db import models
class Profile(models.Model):
name = models.CharField(max_length = 50)
picture = models.ImageField(upload_to = 'pictures')
class Meta:
db_table = "profile"
Como puede ver para el modelo, ImageField toma un argumento obligatorio: upload_to. Esto representa el lugar del disco duro donde se guardarán sus imágenes. Tenga en cuenta que el parámetro se agregará a la opción MEDIA_ROOT definida en su archivo settings.py.
Ahora que tenemos el formulario y el modelo, creemos la vista, en myapp / views.py -
#-*- coding: utf-8 -*-
from myapp.forms import ProfileForm
from myapp.models import Profile
def SaveProfile(request):
saved = False
if request.method == "POST":
#Get the posted form
MyProfileForm = ProfileForm(request.POST, request.FILES)
if MyProfileForm.is_valid():
profile = Profile()
profile.name = MyProfileForm.cleaned_data["name"]
profile.picture = MyProfileForm.cleaned_data["picture"]
profile.save()
saved = True
else:
MyProfileForm = Profileform()
return render(request, 'saved.html', locals())
La parte que no debe perderse es que hay un cambio al crear un ProfileForm, agregamos un segundo parámetro: request.FILES. Si no se aprueba, la validación del formulario fallará, dando un mensaje que dice que la imagen está vacía.
Ahora, solo necesitamos el saved.html plantilla y el profile.html plantilla, para el formulario y la página de redirección -
myapp/templates/saved.html -
<html>
<body>
{% if saved %}
<strong>Your profile was saved.</strong>
{% endif %}
{% if not saved %}
<strong>Your profile was not saved.</strong>
{% endif %}
</body>
</html>
myapp/templates/profile.html -
<html>
<body>
<form name = "form" enctype = "multipart/form-data"
action = "{% url "myapp.views.SaveProfile" %}" method = "POST" >{% csrf_token %}
<div style = "max-width:470px;">
<center>
<input type = "text" style = "margin-left:20%;"
placeholder = "Name" name = "name" />
</center>
</div>
<br>
<div style = "max-width:470px;">
<center>
<input type = "file" style = "margin-left:20%;"
placeholder = "Picture" name = "picture" />
</center>
</div>
<br>
<div style = "max-width:470px;">
<center>
<button style = "border:0px;background-color:#4285F4; margin-top:8%;
height:35px; width:80%; margin-left:19%;" type = "submit" value = "Login" >
<strong>Login</strong>
</button>
</center>
</div>
</form>
</body>
</html>
A continuación, necesitamos nuestro par de URL para comenzar: myapp / urls.py
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
urlpatterns = patterns(
'myapp.views', url(r'^profile/',TemplateView.as_view(
template_name = 'profile.html')), url(r'^saved/', 'SaveProfile', name = 'saved')
)
Al acceder a "/ myapp / profile", obtendremos la siguiente plantilla profile.html renderizada:
Y en la publicación del formulario, se procesará la plantilla guardada:
Tenemos una muestra para imagen, pero si desea cargar otro tipo de archivo, no solo imagen, simplemente reemplace el ImageField tanto en modelo como en forma con FileField.