[PYTHON] [Django] Implémenter une fonction de téléchargement de fichier image qui n'utilise pas de modèle

introduction

Lors du téléchargement d'un fichier image avec l'application Django, je pense que c'est une pratique standard de l'enregistrer dans la base de données en utilisant ImageField. Cependant, l'application que j'ai créée l'autre jour en pratique doit enregistrer le fichier dans un dossier spécifique au lieu de ** en raison de l'intégration avec d'autres systèmes **, et il a fallu un certain temps pour savoir comment le faire, j'ai donc écrit un article Je vais le laisser.

Conclusion

Ceci peut être réalisé en utilisant ** forms.ImageField **.

échantillon

Vous trouverez ci-dessous un exemple de la configuration minimale.

haut de page image.png

L'écran change lorsque vous sélectionnez un fichier image approprié et que vous l'envoyez. image.png

Si vous regardez le répertoire de base du projet, un dossier "racine_média" est créé et les fichiers téléchargés y sont enregistrés. image.png

Si vous téléchargez un fichier autre qu'une image, un message d'erreur s'affiche. image.png

La source

forms.py


import datetime
from django import forms
from django.core.files.storage import default_storage


class FileUploadSampleForm(forms.Form):
    file = forms.ImageField()

    def save(self):
        """Méthode pour enregistrer le fichier"""
        now_date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')  #Obtenez pour donner l'heure actuelle au nom du fichier
        upload_file = self.files['file']  #Récupérez le fichier de téléchargement à partir du formulaire
        file_name = default_storage.save(now_date + "_" + upload_file.name, upload_file)  #Enregistrer le fichier La valeur de retour est le nom du fichier réellement enregistré
        return default_storage.url(file_name)

views.py


from django.shortcuts import render
from django.views.generic import View
from .forms import FileUploadSampleForm


class IndexView(View):
    def get(self, request, *args, **kwargs):
        """Méthode de demande GET"""
        form = FileUploadSampleForm
        return render(request, 'fileUploadSample/index.html', {"form": form})

    def post(self, request, *args, **kwargs):
        """Méthode de demande POST"""
        form = FileUploadSampleForm(request.POST, request.FILES)

        if not form.is_valid():
            return render(request, 'fileUploadSample/index.html', {"form": form})

        filename_save = form.save()

        context = {
            'form': form,
            'filename_save': filename_save,
        }
        return render(request, 'fileUploadSample/index.html', context)


index = IndexView.as_view()

index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{% url 'fileUploadSample:index' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}

    {#forms.Afficher le champ d'image#}
    {{ form.file }}
    <br><br>

    {#Afficher le message d'erreur#}
    {% for field in form %}
        {% if form.errors %}
            <font color=#CC3300>{{ field.errors }}</font><br>
        {% endif %}
    {% endfor %}

    {#Afficher le nom du fichier enregistré#}
    {% if filename_save %}
nom de fichier{{ filename_save }}Il a été enregistré dans.
        <br><br>
    {% endif %}

    <input type="submit" value="Envoyer"/>
</form>
</body>
</html>

urls.py


from django.urls import path
from . import views

app_name = 'fileUploadSample'
urlpatterns = [
    path('', views.index, name='index'),
]

Veuillez ajouter ce qui suit à settings.py.

settings.py


MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root')

Vous pouvez également utiliser ** forms.FileField ** pour prendre en charge le téléchargement de fichiers autres que des images (même s'il ne s'agit pas d'un fichier image, form.is_valid () éliminera l'erreur).

c'est tout. Merci pour votre travail acharné: cat2:

Recommended Posts

[Django] Implémenter une fonction de téléchargement de fichier image qui n'utilise pas de modèle
Téléchargement de fichiers avec django
Créer en Python sans fichier image factice dans Django et tester le téléchargement de l'image
Fonction de téléchargement d'image avec Vue.js + Flask
Développement d'une application WEB avec Django [Définition de modèle]
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Implémenter OAuth sans bibliothèque client (Java)
Obtenir un modèle de référence à l'aide de Django Serializer
Implémenter un modèle utilisateur personnalisé dans Django
Exécutez des fichiers Python à partir de HTML en utilisant Django