[PYTHON] Die Geschichte der Anzeige von Mediendateien in Django

So zeigen Sie Mediendateien in Django an

Zunächst sieht es so aus, als würde man die Dateiregistrierung im Webdienst akzeptieren.

Dateiregistrierung ↓ Dateianzeige

Insbesondere hat Django eine Klasse namens ** File Field **, die sich dem Speichern von Dateien widmet. Weil es Klassen gibt, die als ** Upload-Formular ** und ** Modell ** bezeichnet werden. Ich denke, das ist ziemlich einfach.

Da es schwierig ist, auf der Upload-Seite zu schreiben, kann es in Ordnung sein, ein offizielles Dokument zu schreiben. (Datei hochladen) Grob gesagt sieht es so aus

Von Django unterstützte Klassen Funktion
Dateifeld Empfangen Sie Dateiinformationen von der Anforderung, zeichnen Sie die Binärdaten im Verzeichnis auf und zeichnen Sie die Dateiadresse in der Datenbank auf
Formular hochladen Legen Sie einen Wert im Feld des Modells fest (Entität in Java)
Modell- Es hat ein Modellfeld (Entität in Java). Das Django-Modell ist standardmäßig mit ORM-Funktionen ausgestattet, und DBs und Felder werden immer migriert und synchronisiert. Speichern Sie außerdem im Modell()Die Methode ist installiert. Auto-Persistenz-Einheit(´ ・ ω ・ `)

Zunächst müssen Sie die Mediendatei festlegen Legt das Stammverzeichnis für Mediendateien fest.

Server Einstellungen. Django- und Nginx-Einstellungen

Stellen Sie settings.py wie gewohnt ein.

setting.py


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')   #← Fügen Sie dies hinzu
MEDIA_URL = '/media/'

BASE_DIR ist zwei über settings.py, dh das Stammverzeichnis der App mit ** manage.py **. Es bedeutet das. Daher wird das Stammverzeichnis der Mediendatei auf das Medienverzeichnis ** im selben Verzeichnis wie ** manage.py festgelegt. Die URL für den Zugriff auf die Mediendatei ist auf ** / media / ** festgelegt.

Selbst wenn in diesem Zustand die Django-Seite in Ordnung ist, erhält die Nginx-Seite Zugriff Weil ich eine Fehlermeldung wie "Die Datei ist zu groß!" Erhalte.

Ich schicke dir eine große Bilddatei. Ich muss die Einstellung schreiben. Öffnen wir die Einstellungsdatei

% sudo vim /etc/nginx/conf.d/site.conf $Speicherort der Nginx-Einstellungen für Ubuntu. Versuchen Sie für CentOS-Sekte eine andere Datei

site.conf


server {
   listen  80;
   listen [::]:80;
   server_name sample;
   client_max_body_size 20M; #hinzufügen. Die maximale Größe der Anforderungsübertragung beträgt 20 MB

   location /static {
       alias /home/Benutzername, den Sie festgelegt haben/App root/static;
   }

   location /media {  #hinzufügen. Legen Sie die Mediendatei und die URL fest
       alias /home/Benutzername, den Sie festgelegt haben/App root/media;
   }

   location / {
       proxy_pass http://127.0.0.1:8000;
    }
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Forwarded-Proto $scheme;
}

Stellen wir sicher, dass der Speicherort und der Medienstamm von Django auf denselben Speicherort wie diesen verweisen (^-^)

Damit sind die Servereinstellungen abgeschlossen!

Verwendung der Upload-Funktion

Es ist ärgerlich, also werde ich es aufschlüsseln und erklären (´ ・ ω ・ `) Das Dateifeld wird verwendet, indem es wie folgt in das Modell integriert wird.

fileModel.py


from django.core.validators import FileExtensionValidator
from django.db import models

'''
Bildmodell
@author Nozawa
'''
class Picture(models.Model):
    id = models.BigAutoField(primary_key=True,unique=True)
    name = models.CharField(max_length=200)
    image = models.FileField(upload_to='upload_pict/%Y/%m/%d/',
                             verbose_name='Hochgeladenes Bild',
                             validators=[FileExtensionValidator(['jpg','png','gif', ])],
                             ) #upload_Wählen Sie das Speicherzielverzeichnis mit aus, um die Erweiterung mit Validatoren auszuwählen. Ausführlich_Legen Sie fest, wie auf dem Verwaltungsbildschirm der Name angezeigt werden soll
    uploader = models.CharField(max_length=200)
    uploadDate = models.DateField()
    updateDate = models.DateField()
    deleteFlg = models.BooleanField()

    def __str__(self):
        return '<Picture:id' + str(self.id) + ', ' + \
            self.name + '(' + str(self.uploader) + ')>'

Das Upload-Formular wird so verwendet.

PictUploadForm.py



'''
Modellformular für das Hochladen von Bildern
'''
class PictUploadForm(forms.ModelForm):
    class Meta:
        model = Picture
        fields = ['name', 'image']

pictureService.py


    def createPicutre(self, request):
        pict:PictUploadForm = PictUploadForm(request.POST, request.FILES, instance=pictObj)
        pict.errors
        if pict.is_valid():
        #Überprüfen Sie, ob der Wert korrekt ist(Validierung)
            pict.save()
            #Wert in DB registrieren

Tatsächlich ist das Upload-Formular eine Funktion, bei der die ursprüngliche Art des Schreibens eines Datei-Uploads weggelassen wird. Das Upload-Formular erfolgt durch Eingabe der Modellinstanz und der Anforderung. ** Eine praktische Klasse, die automatisch Werte für das Modell festlegt **!

Ursprünglich ist es, wie das offizielle Dokument sagt, so geschrieben

sample.py


            instance = ModelWithFileField(file_field=request.FILES['file']) #Der Feldname wird im Konstruktor angegeben und festgelegt.
            instance.save()

Schließlich wird der Bildschirm auf der Upload-Seite angezeigt.

UploadView.py


class UploadView(TemplateView):
    #Initialisierungsprozess
    def __init__(self):
        self.params = {
            'form': PictUploadForm.PictUploadForm(),
        }
    #Bildform anzeigen
    def get(self, request):
        #Bildobjekt ersetzen
        return render(request, 'memFrame/Bildschirm hochladen.html', self.params)

Bildschirm hochladen.html


<form action="{% url 'pictUpload' %}" method="post" enctype="multipart/form-data"> <!--Richten Sie Multipart ein und bereiten Sie den Datei-Upload vor-->
    {% csrf_token %}
    {{ form.name }}
    {{ form.image }}
    <tr>
        <td>
            <input type="submit" value="Bilder hochladen!"/>
        </td>
    </tr>
</form>

Verwendung der Anzeigefunktion

ViewingView.py


class ViewingView(TemplateView):
    #Bilddienstklasse
    pictService:PictService = PictService.PictService()
    #Bildform anzeigen
    def get(self, request):
        #Bildobjekt ersetzen
        pictList:list = self.pictService.findAll()
        self.params = {
            'picts':pictList,
        }

        print(pictList)

        return render(request, 'myapplication/Anzeigebildschirm.html', self.params)

Anzeigebildschirm.html


{% for pict in picts %}
    <h2>{{ pict.name }}</h2>
    <img src='{{pict.image.url}}' width=200> #Geben Sie die URL des Dateifelds im Bild-Tag an
{% endfor %}

Ergebnis

Ich konnte das hochgeladene Bild anzeigen ヾ (.> ﹏ <.) ノ ✧ *.

image.png

image.png

Recommended Posts

Die Geschichte der Anzeige von Mediendateien in Django
Die Geschichte der Teilnahme an AtCoder
Die Geschichte des "Lochs" in der Akte
Die Geschichte von sys.path.append ()
Die Geschichte, das optimale n in N Faust zu finden
Die Geschichte des Lesens von HSPICE-Daten in Python
Die Geschichte des Aufbaus der schnellsten Linux-Umgebung der Welt
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Die Geschichte des Baus von Zabbix 4.4
Ich habe an der Übersetzungsaktivität des offiziellen Django-Dokuments teilgenommen
Wartung der Django + MongoDB-Entwicklungsumgebung (mitten im Schreiben)
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
Die Geschichte der Herabstufung der Version von Tensorflow in der Demo von Mask R-CNN.
Die Geschichte von Python und die Geschichte von NaN
Umgang mit JSON-Dateien in Python
Wechseln Sie die in Django 1.9 angezeigte Sprache
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Die Geschichte des Exportierens eines Programms
Holen Sie sich die Abfragezeichenfolge (Abfragezeichenfolge) mit Django
django kann nicht in der Entwicklungsumgebung von pipenv + pyenv installiert werden
Die Geschichte der Ausgabe des Planetarium-Meisters im PDF-Format mit Pycairo
Führen Sie einen Anwendungstest für Migrationsdateien mit Django + PostgreSQL (Evil Edition) durch.
Die Geschichte, dass "calendar.day_abbr" auf dem Admin-Bildschirm von django nicht aktualisiert werden konnte
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Betrachten Sie die Beschreibung von Dockerfile (Django + MySQL②)
Holen Sie sich die IP-Adresse des Kunden mit Django
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
Die Geschichte des Versuchs, den Client wieder zu verbinden
Ich habe den asynchronen Server von Django 3.0 ausprobiert
[Verständnis in 3 Minuten] Der Beginn von Linux
Überprüfen Sie das Verhalten des Zerstörers in Python
Verstehen Sie den Komfort des Django Rest Framework
Django ~ Lass es uns im Browser anzeigen ~
So überprüfen Sie die Version von Django
Ausgabebaumstruktur von Dateien in Python
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Hinweise zum Erstellen statischer Dateien mit Django
Lesen Sie alle CSV-Dateien im Ordner
Die Geschichte einer unveränderlichen Form
Das Ergebnis der Installation von Python auf Anaconda
Die Geschichte der Manipulation globaler Python-Variablen
Die Geschichte, deep3d auszuprobieren und zu verlieren
Dekodierung von Keras 'LSTM model.predict
Hallo Welt nicht localhost in Django
Auf der Suche nach dem schnellsten FizzBuzz in Python
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte von pep8 wechselt zu pycodestyle
Die Geschichte der Verwendung von mysqlclient, da PyMySQL nicht mit Django 2.2 verwendet werden kann
Versuchen Sie, die Spotify-API in Django zu aktivieren.
Betrachten Sie die Beschreibung von docker-compose.yml (Django + MySQL ③)
So identifizieren Sie die Zugriffsquelle in der generischen Klassenansicht von Django eindeutig
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Überprüfen Sie mit einem Test, wie oft die Abfrage (SQL) in Django ausgelöst wurde
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen