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
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)
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>
Après avoir effectué la migration et démarré le serveur de développement www, Il est accessible sur http: // localhost: 8000 / fileupload /.
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