[PYTHON] ImageKit generiert automatisch Miniaturansichten aus ImageField in Django

Informationen zur Verwendung von Bildern mit Django.

ImageField

Django kann ein Feld namens ImageField definieren. Dies ist ein Feld, das von FileField erbt.

Zur detaillierten Verwendung http://qiita.com/kojionilk/items/da20c732642ee7377a78 Es ist hier sehr gut organisiert.

Wenn Sie jedoch beim Löschen des Datensatzes einfach die Datei löschen möchten,

models.py


model.objects.delete(False)

Es scheint, dass es getan werden sollte.

https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.fields.files.FieldFile.delete

Ich wusste es nicht einmal.

ImageKit

Wenn Sie jetzt mit Bildern im Web arbeiten, reicht es nicht aus, nur zu speichern. Es ist erforderlich, Bilder mit unterschiedlicher Bildqualität und -größe wie Miniaturansichten und große Bilder vorzubereiten.

Es ist jedoch mühsam, es selbst zu schaffen ...

Deshalb ist Imagekit hier.

https://github.com/matthewwithanm/django-imagekit

console


pip install -U django-imagekit

Sie können es mit installieren.

Kissen ist erforderlich, wenn Sie es nicht installiert haben

console


pip install -U Pillow

Machen wir das.

Fügen Sie imagekit zu INSTALLED_APPS in settings.py von django hinzu.

Sie können es jetzt verwenden.

Was ist ImageKit?

ImageKit ist ein Modul, das ein Bild beim Hochladen einer Datei in die im Modell festgelegte Qualität und Größe konvertiert.

Ich habe das Gefühl, dass der Prozess selbst abgeschlossen ist, wenn die Vorlage zum ersten Mal aufgerufen wird.

Models.py

Definieren Sie es so.

Ich habe "ImageField" definiert, das ist das Basisfeld. Die anderen Felder sind ImageKit-Einstellungen. Definiert die Größe und Qualität der Größenänderung.

models.py


from django.db import models
from imagekit.models import ImageSpecField, ProcessedImageField
from imagekit.processors import ResizeToFill


class Image(models.Model):

    origin = models.ImageField(upload_to="photos/%y/%m/%d/")

    big = ImageSpecField(source="origin",
                         processors=[ResizeToFill(1280, 1024)],
                         format='JPEG'
                         )

    thumbnail = ImageSpecField(source='origin',
                            processors=[ResizeToFill(250,250)],
                            format="JPEG",
                            options={'quality': 60}
                            )

    middle = ImageSpecField(source='origin',
                        processors=[ResizeToFill(600, 400)],
                        format="JPEG",
                        options={'quality': 75}
                        )

    small = ImageSpecField(source='origin',
                            processors=[ResizeToFill(75,75)],
                            format="JPEG",
                            options={'quality': 50}
                            )

Vorlage

Dies ist ein Beschreibungsbeispiel für die Vorlage.

template.html


<ul class="list-unstyled image-list">
    {% for image in image_list %}
    <li>
        <a href="{% url 'image_detail' image.id %}">
            <img src="{{ image.thumbnail.url }}" width="250">
        </a>
    </li>
    {% endfor %}
</ul>

Auch das erzeugte Bild ist

settings.py


MEDIA_ROOT = os.path.join(ROOT_DIR, "media")  #Beispiel
# ROOT_DIR/media/CACHE/...

Ein `` `CACHE``` Verzeichnis wird erstellt und in MEDIA_ROOT gespeichert. Daher ist die URL auch

settings.py


MEDIA_URL = "/media/"  #Beispiel
# /media/CACHE/...

Es wird geliefert von.

views.py

Das Tolle ist, dass views.py nichts macht. Wenn Sie es wie gewohnt beibehalten, wird ImageKit das Richtige für Sie tun.

views.py


from django.views.generic import ListView

from images.models import Image


class ImageListView(ListView):
    model = Image
    context_object_name = 'image_list'

forms.py

Die Form ändert sich überhaupt nicht. Das übliche Formular zum Hochladen von Dateien ist in Ordnung.

forms.py


from django.forms import ModelForm
from images.models import Image

class UploadFileForm(ModelForm):
    class Meta:
        model = Image
        fields = ["origin", ]

Seien Sie beim Schreiben eines Formulars in eine Vorlage vorsichtig, da es nicht hochgeladen wird, wenn Sie "enctype =" multipart / form-data "" vergessen. Ich habe ein paar Stunden verschwendet. Ich habe es oft gemacht.

upload.html


{% extends 'base.html' %}

{% block content %}

<form method="POST" action="{% url 'image_upload' %}" enctype="multipart/form-data">
  {% csrf_token %}
  {% load crispy_form_tags %}
  {{ form|crispy }}

  <button class="btn btn-primary" type="submit">hochladen</button>
</form>

{% endblock %}

Zusammenfassung

Es scheint andere nützliche Felder zu geben, aber ich werde sie weglassen. Ich denke, dass es ausreicht, nur die README-Datei auf Github zu lesen, um sie zu verwenden.

Recommended Posts

ImageKit generiert automatisch Miniaturansichten aus ImageField in Django
Ordnen Sie Controller automatisch URLs mit Flask zu
[Django] Erstellen Sie ein Formular, das automatisch die Adresse aus der Postleitzahl ausfüllt
So reflektieren Sie ImageField in Django + Docker (Kissen)
Modell in Django
Form in Django