[PYTHON] Comment télécharger des fichiers dans la vue de classe générique Django

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

Comment télécharger des fichiers dans une vue de classe générique dans Django Il n'y a pas beaucoup d'informations japonaises. Par conséquent, cela a pris du temps. J'écrirai un article pour ne pas l'oublier. Cet article est destiné à ceux qui souhaitent comprendre rapidement les principes des téléchargements de fichiers.

Si vous êtes nouveau sur Django, cliquez ici. Tutoriel pratique sur Django en 10 minutes

Préparation

Le nom du projet est mysite et le nom de l'application est fileupload. Créez un dossier média dans mysite / et utilisez-le comme emplacement de stockage pour les fichiers.

Jusqu'à présent, la disposition des fichiers est la suivante.

mysite/
    mysite/
        __pycashe__/    <-Ne vous inquiétez pas
        setting.py, urls.py etc.*.5 py
    fileupload/
        migrations/     <-Ne vous inquiétez pas
        models.py, views.py etc.*.6 py
    media/              <-Où enregistrer le fichier téléchargé
    manage.py           <-Pour la gestion de projet

Enregistrez le fichier d'application dans le projet Django. Par conséquent, ajoutez-le à INSTALLED_APPS dans settings.py.

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',
]

Enregistrez également un répertoire pour le téléchargement de fichiers. Pour cela, ajoutez deux lignes à settings.py.

mysite/mysite/settings.py


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

Ajouté à urls.py pour enregistrer l'url.

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)

Implémentation de l'application

Créez un modèle Fileupload. Il y a deux champs, le titre du fichier et le fichier lui-même. Le fichier est enregistré dans un dossier nommé media / uploads / year / month / day. En supposant que vous téléchargez une photo, l'extension est uniquement 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
    )

Créez une vue. Après tout, utiliser la vue de classe générique de Django est facile. La vue de classe générique a des noms de variables par défaut, des noms de fichiers, etc. Vous ne pouvez pas l'utiliser sans le savoir (par exemple, fileupload_object_name ou template_name). C'est pourquoi je lui ai explicitement donné un nom descriptif au lieu du nom par défaut.

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'

Enregistrez la vue dans l'URL. Créez un nouveau fichier fileupload / urls.py. Enregistrez la vue créée.

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'),
]

Créez un fichier html pour le modèle dans fileupload / templates / fileupload /. Correspond à chaque vue.

mysite/fileupload/templates/fileupload/fileupload_list.html


<h1>Lister les fichiers</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' %}">Télécharger un nouveau fichier</a></p>

mysite/fileupload/templates/fileupload/fileupload_create.html


<h1>Téléchargement de fichiers</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>Détails du fichier</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' %}">Lister les fichiers</a></p>

mysite/fileupload/templates/fileupload/fileupload_update.html


<h1>Mise à jour du fichier</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>Supprimer le fichier</h1>

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

terminer

Après avoir effectué la migration et démarré le serveur de développement www, Il est accessible sur http: // localhost: 8000 / fileupload /.

Tâche

Le traitement lorsque le téléchargement du fichier échoue n'est pas écrit correctement, c'est donc une tâche future.

La fin

Recommended Posts

Comment télécharger des fichiers dans la vue de classe générique Django
Comment utiliser le bootstrap dans la vue de classe générique Django
Comment identifier de manière unique la source d'accès dans la vue de classe générique Django
Ajax dans Django (en utilisant la vue de classe générique)
Comment référencer des fichiers statiques dans un projet Django
Comment refléter CSS dans Django
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer des sessions expirées dans Django
Comment utiliser __slots__ dans la classe Python
Comment faire des événements envoyés par le serveur dans Django
Comment lire des fichiers CSV avec Pandas
Comment afficher les images dans l'administration de Django
Comment télécharger automatiquement des fichiers .gpx sur Strava
Pour trouver le nom de la vue avec l'espace de noms à partir de l'URL (path_info) dans Django
Comment implémenter la fonctionnalité de type helper Rails dans Django
Résumé de la façon d'importer des fichiers dans Python 3
Comment refléter ImageField dans Django + Docker (oreiller)
Comment vérifier / extraire des fichiers dans un package RPM
Passer les informations de connexion à afficher dans Django
Comment obtenir les fichiers dans le dossier [Python]
Comment créer une API Rest dans Django
Télécharger des fichiers avec Django
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment utiliser des variables dans les fichiers de définition d'unité systemd
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Comment ajouter des numéros de page à un fichier PDF (en Python)
Comment utiliser Decorator dans Django et comment le créer
Comment développer en Python
Télécharger plusieurs fichiers avec Flask
Comment écrire une validation personnalisée dans Django REST Framework
[Django 2.2] Comment affichez-vous la destination de la relation dans Django? [Affichage de liste]
Gestion des fichiers statiques lors du déploiement en production avec Django
Comment utiliser ORM / Query Builder Orator de type Laravel avec Django
Comment utiliser la méthode __call__ dans la classe Python
Comment vérifier le comportement d'ORM avec un fichier avec django
Comment mettre à jour les informations utilisateur sur Django RemoteUserMiddleware login
[Django] Comment donner des valeurs d'entrée à l'avance avec ModelForm
Comment définir l'attribut de classe html dans le formulaire forms.py de Django
Comment télécharger des fichiers sur Cloud Storage avec le SDK Python de Firebase
Comment générer une requête à l'aide de l'opérateur IN dans Django
Dans Django, comment abréger la longue chaîne de caractères affichée au milieu ...
Comment afficher une colonne de fichiers spécifiée sous Linux (awk)
[Python] Comment faire PCA avec Python
[Django] Comment tester le formulaire [TDD]
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Erreur liée à memcached dans django
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment définir intelligemment les objets couramment utilisés dans View
Comment convertir 0,5 en 1056964608 en un seul coup
Comment démarrer avec Django
Comment tuer des processus en vrac
Comment utiliser Mysql avec python