====== Tractament d'imatges en Django ======
Les imatges, en [[Django]], necessiten un tractament particular.
{{tag> #FpInfor #Daw #DawMp07 django framework python web}}
\\
===== Algunes consideracions =====
Django processa eficientment les dades de l'aplicació, però no és ràpid per servir els arxius voluminosos com les imatges, o d'altres que es demanen molt sovint com els arxius estàtics (CSS, etc.).
Per això el tractament d'imatges té certes peculiaritats. Guardarem els binaris en una carpeta, típicament ''media/'' i en producció deixarem que les serveixi el servidor web (Apache o Nginx). Django ho pot fer, però no és convenient.
Així, un esquena de posada en producció de Django seria quelcom similar a:
{{:django:diagrama_django_produccio.png?direct}}
Per saber més podeu llegir sobre [[Django#Django en produccio]] en aquesta wiki.
\\
===== Configuració imatges i carpeta 'media' =====
Instal·lar la biblioteca Pillow per al tractament d'imatges:
(env) $ pip install Pillow
Afegir el camp desijat als models
from django.db import models
class Producte(models.Model):
nom = models.CharField(max_length=100)
imatge = models.ImageField(upload_to='productes/')
Configurar la carpeta de càrregues d'arxius (típicament ''media/'') al ''settings.py'':
import os
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Afegir la configuració a ''urls.py'' per servir els arxius media i estàtics quan estiguem en desenvolupament:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... les teves URLs existents ...
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
\\
===== Visualitzacions a l'admin panel =====
Personalitzar la vista a l'admin panel per veure les imatges:
from django.contrib import admin
from django.utils.html import format_html
from .models import Producte
class ProducteAdmin(admin.ModelAdmin):
# Afegeix el mètode a readonly_fields perquè es mostri en la pàgina d'edició
readonly_fields = ('vista_previa_imatge',)
# Defineix quins camps es mostren en el formulari d'edició
fields = ('nom', 'imatge', 'vista_previa_imatge')
def vista_previa_imatge(self, obj):
if obj.imatge:
# Retorna l'etiqueta HTML amb l'URL de la imatge
return format_html('
', obj.imatge.url)
return "No hi ha imatge"
vista_previa_imatge.short_description = 'Previsualització'
admin.site.register(Producte, ProducteAdmin)
I també podríem personalitzar la vista de llista de l'admin panel:
class ProducteAdmin(admin.ModelAdmin):
list_display = ('nom', 'vista_previa_imatge')
def vista_previa_imatge(self, obj):
if obj.imatge:
return format_html('
', obj.imatge.url)
return "Sense imatge"
vista_previa_imatge.short_description = 'Miniatura'