Django - przesyłanie plików
Ogólnie rzecz biorąc, aplikacja internetowa może przesyłać pliki (zdjęcie profilowe, piosenki, pdf, słowa .....). Omówmy, jak przesyłać pliki w tym rozdziale.
Przesyłanie obrazu
Przed rozpoczęciem zabawy z obrazem upewnij się, że masz zainstalowaną bibliotekę obrazów języka Python (PIL). Teraz, aby zilustrować przesyłanie obrazu, utwórzmy formularz profilu w naszym myapp / forms.py -
#-*- coding: utf-8 -*-
from django import forms
class ProfileForm(forms.Form):
name = forms.CharField(max_length = 100)
picture = forms.ImageFields()
Jak widać, główna różnica polega na tym, że forms.ImageField. ImageField upewni się, że przesłany plik jest obrazem. Jeśli nie, weryfikacja formularza zakończy się niepowodzeniem.
Teraz stwórzmy model „Profil”, aby zapisać nasz przesłany profil. Odbywa się to w 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"
Jak widać w modelu, ImageField przyjmuje obowiązkowy argument: upload_to. Oznacza to miejsce na dysku twardym, w którym zostaną zapisane obrazy. Zauważ, że parametr zostanie dodany do opcji MEDIA_ROOT zdefiniowanej w twoim pliku settings.py.
Teraz, gdy mamy formularz i model, stwórzmy widok w 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())
Część, której nie można przegapić, to zmiana podczas tworzenia ProfileForm, dodaliśmy drugie parametry: request.FILES. Jeśli nie zostanie pomyślnie zatwierdzony, weryfikacja formularza zakończy się niepowodzeniem, wyświetlając komunikat, że obraz jest pusty.
Teraz potrzebujemy tylko saved.html szablon i profile.html szablon, dla formularza i strony przekierowującej -
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>
Następnie potrzebujemy naszej pary adresów URL, aby rozpocząć: 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')
)
Uzyskując dostęp do „/ myapp / profile”, otrzymamy wyrenderowany szablon profile.html -
Po wysłaniu formularza zapisany szablon zostanie wyrenderowany -
Mamy próbkę obrazu, ale jeśli chcesz przesłać inny typ pliku, nie tylko obraz, po prostu zastąp ImageField w modelu i formie z FileField.