Django - Dosya Yükleme
Bir web uygulamasının dosyaları (profil resmi, şarkılar, pdf, kelimeler .....) yükleyebilmesi genellikle yararlıdır. Bu bölümde dosyaların nasıl yükleneceğini tartışalım.
Bir Görüntü Yükleme
Bir görüntü ile oynamaya başlamadan önce, Python Görüntü Kitaplığının (PIL) kurulu olduğundan emin olun. Şimdi bir resim yüklemeyi göstermek için, benimapp / forms.py dosyamızda bir profil formu oluşturalım -
#-*- coding: utf-8 -*-
from django import forms
class ProfileForm(forms.Form):
name = forms.CharField(max_length = 100)
picture = forms.ImageFields()
Gördüğünüz gibi, buradaki temel fark, forms.ImageField. ImageField, yüklenen dosyanın bir resim olduğundan emin olacaktır. Aksi takdirde, form doğrulama başarısız olur.
Şimdi yüklenen profilimizi kaydetmek için bir "Profil" modeli oluşturalım. Bu myapp / models.py içinde yapılır -
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"
Modelde görebileceğiniz gibi, ImageField zorunlu bir argüman alır: upload_to. Bu, resimlerinizin sabit sürücüde kaydedileceği yeri temsil eder. Parametrenin, settings.py dosyanızda tanımlanan MEDIA_ROOT seçeneğine ekleneceğini unutmayın.
Artık Form ve Model elimizde olduğuna göre, myapp / views.py içinde görünümü oluşturalım -
#-*- 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())
Kaçırılmaması gereken kısım, bir ProfileForm oluştururken bir değişiklik olması, ikinci bir parametre ekledik: request.FILES. Geçilmezse, form doğrulaması başarısız olur ve resmin boş olduğunu belirten bir mesaj verir.
Şimdi, sadece ihtiyacımız olan saved.html şablon ve profile.html şablon, form ve yönlendirme sayfası için -
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>
Ardından, başlamak için URL çiftimize ihtiyacımız var: uygulamam / 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')
)
"/ Uygulamam / profil" e erişirken, aşağıdaki profile.html şablonunu oluşturacağız -
Ve form gönderisinde, kaydedilen şablon işlenecek -
Resim için bir örneğimiz var, ancak yalnızca resim değil, başka türde bir dosya yüklemek istiyorsanız, ImageField hem Model hem de Formda FileField.