[PYTHON] Hochladen von Dateien in der generischen Klassenansicht von Django

2020-04-07 Erstellt: windows10 / Python-3.8.2-amd64 / Django-3.0.4

So laden Sie Dateien in der allgemeinen Klassenansicht in Django hoch Es gibt nicht viele japanische Informationen. Daher hat es lange gedauert. Ich werde einen Artikel schreiben, damit ich ihn nicht vergesse. Dieser Artikel richtet sich an Personen, die ein schnelles Verständnis der Prinzipien des Hochladens von Dateien wünschen.

Wenn Sie neu in Django sind, klicken Sie hier. Praktisches Tutorial zu Django in 10 Minuten

Vorbereitung

Der Projektname lautet mysite und der Anwendungsname lautet fileupload. Erstellen Sie ein Ordnermedium in mysite / und verwenden Sie es als Speicherort für Dateien.

Die Anordnung der Dateien ist bisher wie folgt.

mysite/
    mysite/
        __pycashe__/    <-macht dir keine Sorgen um
        setting.py, urls.py etc.*.5 py
    fileupload/
        migrations/     <-macht dir keine Sorgen um
        models.py, views.py etc.*.6 py
    media/              <-Wo soll die hochgeladene Datei gespeichert werden?
    manage.py           <-Für das Projektmanagement

Registrieren Sie das Hochladen der Anwendungsdatei im Django-Projekt. Fügen Sie es daher zu INSTALLED_APPS in settings.py hinzu.

mysite/mysite/settings.py


INSTALLED_APPS = [
    'fileupload.apps.FileuploadConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Registrieren Sie auch ein Verzeichnis zum Hochladen von Dateien. Fügen Sie dazu zwei Zeilen zu settings.py hinzu.

mysite/mysite/settings.py


MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Zu urls.py hinzugefügt, um URL zu registrieren.

mysite/mysite/urls.py


from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('fileupload/', include('fileupload.urls')),
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Anwendungsimplementierung

Erstellen Sie ein Modell Fileupload. Es gibt zwei Felder, den Titel der Datei und die Datei selbst. Die Datei wird in einem Ordner mit dem Namen media / uploads / year / month / day gespeichert. Angenommen, Sie laden ein Foto hoch, ist die Erweiterung nur jpg.

mysite/fileupload/models.py


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

class Fileupload(models.Model):
    titlefield = models.CharField(max_length = 200, null = True)
    filefield = models.FileField(
        upload_to = 'uploads/%Y/%m/%d/',
        verbose_name = 'attached file',
        validators=[FileExtensionValidator(['jpg', ])],
        null = True
    )

Erstellen Sie eine Ansicht. Schließlich ist die Verwendung der generischen Klassenansicht von Django einfach. Die generische Klassenansicht enthält Standardvariablennamen, Dateinamen usw. Es kann nicht ohne Wissen verwendet werden (z. B. "fileupload_object_name" oder "template_name"). Deshalb habe ich ihm explizit einen beschreibenden Namen anstelle des Standardnamens gegeben.

mysite/fileupload/views.py


from django.views import generic
from .models import Fileupload

class FileuploadListView(generic.ListView):
    model = Fileupload
    context_object_name = 'fileupload_context_list'

class FileuploadCreateView(generic.CreateView):
    model = Fileupload
    fields = ['titlefield', 'filefield']
    success_url = '/fileupload'
    template_name = 'fileupload/fileupload_create.html'

class FileuploadDetailView(generic.DetailView):
    model = Fileupload
    template_name = 'fileupload/fileupload_detail.html'
    context_object_name = 'fileupload_context'

class FileuploadUpdateView(generic.UpdateView):
    model = Fileupload
    fields = ['titlefield', 'filefield']
    success_url = '/fileupload'
    template_name = 'fileupload/fileupload_update.html'

class FileuploadDeleteView(generic.DeleteView):
    model = Fileupload
    success_url = '/fileupload'
    template_name = 'fileupload/fileupload_delete.html'

Registrieren Sie die Ansicht in der URL. Erstellen Sie eine neue Datei fileupload / urls.py. Registrieren Sie die erstellte Ansicht.

mysite/fileupload/urls.py


from django.urls import path
from . import views

urlpatterns = [
    path('', views.FileuploadListView.as_view()),
    path('index', views.FileuploadListView.as_view(),
        name = 'site_index'),
    path('create', views.FileuploadCreateView.as_view(),
        name = 'site_create'),
    path('detail/<int:pk>', views.FileuploadDetailView.as_view(),
        name = 'site_detail'),
    path('update/<int:pk>', views.FileuploadUpdateView.as_view(),
        name = 'site_update'),
    path('delete/<int:pk>', views.FileuploadDeleteView.as_view(),
        name = 'site_delete'),
]

Erstellen Sie eine HTML-Datei für die Vorlage in fileupload / templates / fileupload /. Entspricht jeder Ansicht.

mysite/fileupload/templates/fileupload/fileupload_list.html


<h1>Dateien auflisten</h1>

{% if fileupload_context_list %}
  <table>
  {% for temp in fileupload_context_list %}
    <tr>
      <td><a href = "{% url 'site_detail' temp.pk %}"> {{ temp.titlefield }}</a></td>
      <td>{{ temp.filefield }}</td>
      <td><a href = "{% url 'site_update' temp.pk %}">Edit</a></td>
      <td><a href = "{% url 'site_delete' temp.pk %}">Delete</a></td>
    </tr>
  {% endfor %}
  </table>

{% else %}
<p>No file available.</p>

{% endif %}
<p><a href = "{% url 'site_create' %}">Neue Datei hochladen</a></p>

mysite/fileupload/templates/fileupload/fileupload_create.html


<h1>Datei-Upload</h1>

<form method = "post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.titlefield }}
    {{ form.filefield }}
    <input type = "submit" value = "Create" />
</form>

mysite/fileupload/templates/fileupload/fileupload_detail.html


<h1>Dateidetails</h1>

{% if fileupload_context %}
  <ul>
    <li>Primary Key Number : {{ fileupload_context.pk }}</li>
    <li>Memo Text : {{ fileupload_context.titlefield }}</li>
    <li>Memo Text : /media/{{ fileupload_context.filefield }}</li>
    <li>File : <img src = /media/{{ fileupload_context.filefield }} /></li>
  </ul>

{% else %}
<p>No file available.</p>

{% endif %}
<p><a href = "{% url 'site_index' %}">Dateien auflisten</a></p>

mysite/fileupload/templates/fileupload/fileupload_update.html


<h1>Datei aktualisieren</h1>

<form method = "post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.titlefield }}
    {{ form.filefield }}
    <input type = "submit" value = "Save" />
</form>

mysite/fileupload/templates/fileupload/fileupload_delete.html


<h1>Datei löschen</h1>

<form method = "post">
    {% csrf_token %}
    <input type= "submit" value = "Delete" />
</form>

Fertig

Nach Durchführung der Migration und Starten des Entwicklungs-WWW-Servers Es kann unter http: // localhost: 8000 / fileupload / abgerufen werden.

Aufgabe

Der Vorgang, bei dem das Hochladen der Datei fehlschlägt, ist nicht ordnungsgemäß geschrieben, sodass es sich um eine zukünftige Aufgabe handelt.

Das Ende

Recommended Posts

Hochladen von Dateien in der generischen Klassenansicht von Django
Verwendung von Bootstrap in der generischen Klassenansicht von Django
So identifizieren Sie die Zugriffsquelle in der generischen Klassenansicht von Django eindeutig
Ajax in Django (mit generischer Klassenansicht)
So verweisen Sie auf statische Dateien in einem Django-Projekt
Wie man CSS in Django reflektiert
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So löschen Sie abgelaufene Sitzungen in Django
Verwendung von __slots__ in der Python-Klasse
So führen Sie vom Server gesendete Ereignisse in Django durch
Lesen von CSV-Dateien mit Pandas
So zeigen Sie Bilder in Djangos Admin an
So laden Sie automatisch .gpx-Dateien auf Strava hoch
So finden Sie den Ansichtsnamen mit dem Namespace über die URL (path_info) in Django
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Zusammenfassung zum Importieren von Dateien in Python 3
So reflektieren Sie ImageField in Django + Docker (Kissen)
So überprüfen / extrahieren Sie Dateien im RPM-Paket
Übergeben Sie Login-Benutzerinformationen, um sie in Django anzuzeigen
So erhalten Sie die Dateien im Ordner [Python]
So erstellen Sie eine Rest-API in Django
Laden Sie Dateien mit Django hoch
So erhalten Sie mehrere Modellobjekte zufällig in Django
So laden Sie Dateien in Google Drive mit Google Colaboratory
Verwendung von Variablen in systemd Unit-Definitionsdateien
So laden Sie Dateien von Selenium of Python in Chrome herunter
So fügen Sie einer PDF-Datei Seitenzahlen hinzu (in Python)
Wie man Decorator in Django benutzt und wie man es macht
Wie man in Python entwickelt
Hochladen mehrerer Dateien mit Flask
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
[Django 2.2] Wie zeigen Sie das Beziehungsziel in Django an? [Listenansicht]
Umgang mit statischen Dateien bei der Bereitstellung in der Produktion mit Django
Verwendung von Laravel-ähnlichem ORM / Query Builder Orator mit Django
Verwendung der Methode __call__ in der Python-Klasse
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
[Django] Wie man Eingabewerte im Voraus mit ModelForm angibt
So legen Sie das HTML-Klassenattribut in Djangos forms.py fest
Hochladen von Dateien in den Cloud-Speicher mit dem Python-SDK von Firebase
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Wie man in Django die angezeigte lange Zeichenkette in der Mitte abkürzt ....
So zeigen Sie eine bestimmte Dateispalte unter Linux an (awk)
[Python] Wie man PCA mit Python macht
[Django] So testen Sie Form [TDD]
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
Fehler im Zusammenhang mit Memcached in Django
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
So definieren Sie Objekte, die häufig in View verwendet werden, intelligent
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie fange ich mit Django an?
Wie man Prozesse in großen Mengen abbricht
Wie man MySQL mit Python benutzt