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.
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}
)
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 %}
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