Python somo la 62 Kupakia picha (upload) na kuisoma kutoka kwenye database
Katika somo hili utakwenda kujifunza jinsi ya kushughulika na faili, kama ku upload faili kwenye django.
Utangulizi
Katika mifumo mingi mitandaoni tunahitaji kupokea picha kutoka kwa watumiaji: iwe profile picture, product, receipt, au document. Django ni moja ya frameworks zinazoruhusu kushughulikia hii kwa urahisi sana kwa kutumia ImageField, MEDIA_URL, na MEDIA_ROOT.
Leo tutajifunza mfumo mzima kuanzia configuration hadi uonyeshaji wa picha.
Sasa tuingie kwenye somo letu…
SEHEMU YA 1 — Kupanga SETTINGS za media (settings.py)
Kwa default Django haitumii media (files zinazopakiwa), hivyo tunahitaji kuongeza settings mbili muhimu:
1. MEDIA_URL
Hii ndiyo URL itakayotumika kuifikia picha kupitia browser.
Mfano:
MEDIA_URL = '/media/'
2. MEDIA_ROOT
Hiki ni kipath cha folder halisi kwenye computer ambako picha zitahifadhiwa.
Mfano:
import os
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Mahali pa kuweka hizi settings
Zinawekwa ndani ya settings.py sehemu ya chini mara nyingi baada ya STATIC settings, mfano:
# Static files
STATIC_URL = '/static/'
# Media files
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
Kazi yake:
-
MEDIA_URL → Prefix ya kutembelea picha kupitia browser
-
MEDIA_ROOT → Folder ambapo picha zinawekwa kimwili
SEHEMU YA 2 — Kuandaa URL configuration ya media (urls.py)
Hii ni muhimu kwenye development environment; bila hii Django haitoweza kuserve picha.
Fungua project_name/urls.py na ongeza:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... your URLs
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Kazi ya code hii:
-
Inaruhusu Django kuserve picha ukiwa kwenye development mode
-
Production haitumii hii (unakabidhi Nginx au cloud)
SEHEMU YA 3 — Kutengeneza Model yenye ImageField
Fungua app/models.py:
from django.db import models
class ProfilePicture(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='uploads/')
uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Maelezo ya kandoni:
-
upload_to="uploads/"inasababisha picha kuwekwa ndani ya:
media/uploads/filename.jpg -
ImageFieldinahitaji Pillow
Install Pillow:
pip install Pillow
SEHEMU YA 4 — Kufanya Migration
Baada ya kuongeza model:
python manage.py makemigrations
python manage.py migrate
Bila migration:
-
Django haitatengeneza jedwali
-
Huwezi kusave picha kwenye database
-
ImageField itatoa error
SEHEMU YA 5 — Kutengeneza Form ya kupokea picha
Fungua app/forms.py:
from django import forms
from .models import ProfilePicture
class PictureForm(forms.ModelForm):
class Meta:
model = ProfilePicture
fields = ['title', 'image']
SEHEMU YA 6 — Kutengeneza View ya kupokea picha na kuisave
from django.shortcuts import render, redirect
from .forms import PictureForm
def upload_picture(request):
if request.method == 'POST':
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('picture_list')
else:
form = PictureForm()
return render(request, 'upload_picture.html', {'form': form})
Maelezo ya kina:
-
request.FILES MUST → bila hili Django haisomi picha
-
form.save() → inaandika data DB, na kuhifadhi picha MEDIA_ROOT
SEHEMU YA 7 — Template ya Upload (HTML)
templates/upload_picture.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload Picture</button>
</form>
Kwa nini enctype="multipart/form-data" ni lazima?
-
Bila hii browser haitatuma file
-
Hata kama form inaonekana sahihi, Django haitapokea picha
SEHEMU YA 8 — View ya kusoma picha zote
from django.shortcuts import render
from .models import ProfilePicture
def picture_list(request):
pictures = ProfilePicture.objects.all()
return render(request, 'picture_list.html', {'pictures': pictures})
SEHEMU YA 9 — Template ya kuonyesha picha
templates/picture_list.html
<h2>Uploaded Pictures</h2>
{% for pic in pictures %}
<div style="margin-bottom:20px;">
<h4>{{ pic.title }}</h4>
<img src="{{ pic.image.url }}" width="200px">
</div>
{% empty %}
<p>No pictures uploaded.</p>
{% endfor %}
Maelezo:
-
{{ pic.image.url }}→ Django automatically hutengeneza URL ya picha -
Ikiwa MEDIA_URL = "/media/", basi picha itapatikana kama:
127.0.0.1:8000/media/uploads/pic.jpg
Kwa utaratibu huu huu unaweza ku-upload PDF, documents, audio, videos au file lolote — ila badala ya ImageField utatumia FileField, na badala ya kuonyesha kwa <img> utaita file.url.
Je wajua…
-
MEDIA_URL lazima iwe na slash mwisho (
/media/sio/media) -
Production haitumii static() function; hutumia Nginx, Apache, au cloud storage
-
Unaweza kuongeza thumbnail generation kwa Pillow
-
Django admin inaweza ku-upload picha moja kwa moja
Hitimisho
Katika somo hili umejifunza hatua zote muhimu za kushughulika na picha ndani ya Django:
-
Kuweka MEDIA_URL na MEDIA_ROOT kwenye settings.py
-
Kuandaa URL configuration ya media files
-
Kutengeneza model yenye ImageField
-
Kufanya migrations
-
Kutengeneza form ya kupokea picha
-
Kutengeneza view ya kusave picha
-
Kutengeneza template ya upload
-
Kuonyesha picha kwenye template
-
Maelezo ya msingi ya image handling kwenye Django
Umeionaje Makala hii.. ?
Share On:
👉1 ai web app 👉2 Sira ya Mtume Muhammad (s.a.w) 👉3 web hosting 👉4 Simulizi za Hadithi Audio 👉5 Madrasa kiganjani 👉6 Bongolite - Game zone - Play free game
Post zinazofanana:
Python somo la 28: inheritance kwenye OOP
Katika somo hili utakwenda kujifunz amaana ya inheritance na sheria za kuiandika inheritance.
Soma Zaidi...Python somo la 56: Kuongeza Data Katika Database kwa Kutumia Django Admin na Django Shell
Katika somo hili tutajifunza njia mbili muhimu za kuongeza data kwenye database katika project yetu ya pybongo (app: menu). Njia hizi ni: Kutumia Django Admin Kutumia Django Shell Utafahamu pia jinsi ya kusajili models kwenye admin, jinsi ya kuingia admin panel, na namna ya kutengeneza entries mpya za MenuItem.
Soma Zaidi...Python somo la 53: Kutengeneza HTML Form na Django View kwa ajili ya kuingiza data
Katika somo hili tutaangalia jinsi ya kutengeneza fomu ya HTML kwa ajili ya kuingiza data kwenye jedwali la MenuItem, pamoja na kutengeneza view itakayopokea data hiyo na kuihifadhi kwenye database. Pia tutaunganisha form na URL route.
Soma Zaidi...Python somo la 18: Jinsi ya kuandika function
Katika somo hili utakwend akujifunza jinsi ya kuandika function, kuweka parameter na kuitumia function
Soma Zaidi...Python somo la 52: Kutengeneza table na kufanya Migrations Katika Django
Katika somo hili tutajifunza jinsi Django hutumia migrations kuunda na kubadilisha tables kwenye database kulingana na models tunazoandika. Tutapitia maana ya migration, hatua za kuitumia, umuhimu wake, misingi ya makemigrations na migrate, pamoja na mfano halisi kutoka kwenye project yetu ya pybongo (app: menu).
Soma Zaidi...Python somo la 13: Kutumia condition statement - if, else, elif
Katika somo hili tutakwend akuziona aina za condition statement kwneye python na jinsi ya kuzitumia
Soma Zaidi...