723 votes

Besoin d'un minimum de Django reinhardt téléchargement de fichier exemple

Comme un débutant à Django, j'ai de la difficulté à faire un téléchargement de l'app dans Django 1.3. Je ne pouvais pas trouver une date exemple/un extrait. J'ai donc reconnaissant si vous pouviez poster ici ou me référer à un minimum, mais complet (Modèle, Vue, Modèle) exemple de code pour le faire.

1336voto

Akseli Palén Points 7697

Ouf, la documentation de Django n'a pas vraiment le bon exemple à ce sujet. J'ai passé plus de 2 heures pour déterrer tous les morceaux pour comprendre comment cela fonctionne. Avec cette connaissance, j'ai mis en place un projet qui permet de télécharger des fichiers et de leur montrer que liste. Télécharger de la source pour le projet, visitez https://github.com/doph/minimal-django-file-upload-example ou clone:

> git clone https://github.com/doph/minimal-django-file-upload-example.git

Mise à jour 2013-01-30: La source sur GitHub a aussi la mise en œuvre de Django 1.4 en plus de 1,3. Même si, il ya quelques changements le tutoriel suivant est également utile pour la 1.4.

Mise à jour 2013-05-10: la mise en Œuvre de Django 1.5 sur GitHub. Des changements mineurs dans la redirection en urls.py et l'utilisation de l'url de la balise de modèle dans list.html. Grâce à hubert3 pour l'effort.

Mise à jour 2013-12-07: Django 1.6 pris en charge sur GitHub. L'un d'importation changé dans myapp/urls.py. Grâce à Arthedian.

Arborescence du projet

Une base de Django 1.3 projet avec une seule application et médias/ répertoire pour le téléchargement.

minimal-django-file-upload-example/
    src/
        myproject/
            database/
                sqlite.db
            media/
            myapp/
                templates/
                    myapp/
                        list.html
                forms.py
                models.py
                urls.py
                views.py
            __init__.py
            manage.py
            settings.py
            urls.py

1. Paramètres: myproject/settings.py

Pour télécharger et d'envoyer les fichiers, vous devez spécifier où Django stocke les fichiers téléchargés et de ce que l'URL de Django sert. MEDIA_ROOT et MEDIA_URL sont dans settings.py par défaut, mais ils sont vides. Voir les premières lignes dans Django Gestion des Fichiers pour plus de détails. Souvenez-vous aussi de définir la base de données et ajouter myapp à INSTALLED_APPS

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/path/to/myproject/database/sqlite.db'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}
...
MEDIA_ROOT = '/path/to/myproject/media/'
MEDIA_URL = '/media/'
...
INSTALLED_APPS = (
    ...
    'myapp',
)

2. Modèle: myproject/myapp/models.py

Ensuite, vous avez besoin d'un modèle avec un FileField. Ce champ stocke les fichiers par exemple pour media/documents/2011/12/24/ basé sur la date actuelle et MEDIA_ROOT. Voir FileField de référence.

# -*- coding: utf-8 -*-
from django.db import models

class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')

3. Forme: myproject/myapp/forms.py

Pour gérer télécharger bien, vous avez besoin d'un formulaire. Cette forme n'a qu'un seul champ, mais c'est suffisant. Voir le Formulaire de FileField de référence pour plus de détails.

# -*- coding: utf-8 -*-
from django import forms

class DocumentForm(forms.Form):
    docfile = forms.FileField(
        label='Select a file',
        help_text='max. 42 megabytes'
    )

4. Vue: myproject/myapp/views.py

D'un point de vue où toute la magie se produit. Faites attention comment request.FILES sont traités. Pour moi, c'était vraiment dur à repérer le fait qu' request.FILES['docfile'] peuvent être enregistrés à des modèles.FileField juste comme ça. Le modèle save() gère le stockage du fichier sur le système de fichiers automatiquement.

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

from myproject.myapp.models import Document
from myproject.myapp.forms import DocumentForm

def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('myapp.views.list'))
    else:
        form = DocumentForm() # A empty, unbound form

    # Load documents for the list page
    documents = Document.objects.all()

    # Render list page with the documents and the form
    return render_to_response(
        'myapp/list.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )

5. Projet d'Url: myproject/urls.py

Django ne sert pas MEDIA_ROOT par défaut. Que serait dangereux dans l'environnement de production. Mais en stade de développement, on pourrait couper court. Attention à la dernière ligne. Cette ligne permet de Django pour servir des fichiers à partir de MEDIA_URL. Cela ne fonctionne que dans le développement de la scène.

Voir django.conf.les url.statique.statique de référence pour plus de détails. Voir aussi cette discussion sur la signification des fichiers multimédia.

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    (r'^', include('myapp.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

6. App Url: myproject/myapp/urls.py

Pour rendre la vue accessible, vous devez spécifier des url. Rien de spécial ici.

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import patterns, url

urlpatterns = patterns('myapp.views',
    url(r'^list/$', 'list', name='list'),
)

7. Modèle: myproject/myapp/templates/myapp/list.html

La dernière partie: modèle de liste et le formulaire de téléchargement ci-dessous. Le formulaire doit être enctype-attribut "multipart/form-data" et la méthode "post" pour faire de l'upload de Django possible. Voir les Téléchargements de Fichiers de documentation pour plus de détails.

Le FileField a de nombreux attributs qui peuvent être utilisées dans les modèles. E. g. {{ document.d'un document.url }} et {{ document.d'un document.name}}, comme dans le modèle. Voir plus à ce sujet dans l'Aide de fichiers dans les modèles de l'article et Le Fichier de l'objet de la documentation.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Minimal Django File Upload Example</title>   
    </head>
    <body>
    <!-- List of uploaded documents -->
    {% if documents %}
        <ul>
        {% for document in documents %}
            <li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No documents.</p>
    {% endif %}

        <!-- Upload form. Note enctype attribute! -->
        <form action="{% url list %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <p>{{ form.non_field_errors }}</p>
            <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
            <p>
                {{ form.docfile.errors }}
                {{ form.docfile }}
            </p>
            <p><input type="submit" value="Upload" /></p>
        </form>
    </body>
</html> 

8. Initialiser

Il suffit d'exécuter syncdb et runserver.

> cd myproject
> python manage.py syncdb
> python manage.py runserver

Résultats

Enfin, tout est prêt. Sur par défaut de Django environnement de développement, la liste des documents téléchargés peuvent être vu à l' localhost:8000/list/. Aujourd'hui, les fichiers sont téléchargés vers le /chemin/vers/monprojet/media/documents/2011/12/17/ et peut être ouvert à partir de la liste.

J'espère que cette réponse vous aidera à quelqu'un comme beaucoup comme il m'aurait aidée.

90voto

suhail Points 2520

Mise à jour de Akseli Palén de réponse. voir le dépôt github

Démarrer un Projet Django

1). Créer un projet: django-admin.py startproject sample

maintenant un dossier(sample) est créé:

sample/
    manage.py
    sample/
        __init__.py
        settings.py
        urls.py
        wsgi.py 

2). Sur setting.py ajouter:

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

4). urls.py ajouter:

...<other imports>...
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    url(r'^upload/$', 'uploader.views.home', name='imageupload'),
    ...<other url patterns>...
)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Créer un Django App:

5). Créer une application: python manage.py startapp uploader

6). Maintenant un dossier(uploader) avec ces fichiers sont créés:

uploader/
    __init__.py
    models.py
    admin.py
    tests.py
    views.py            

7). Sur setting.py -> INSTALLED_APPS ajouter 'uploader',, c'est à dire:

INSTALLED_APPS = (
    ...
    'uploader',
    ...
)

8) mise à jour de models.py

from django.db import models
from django.forms import ModelForm

class Upload(models.Model):
    pic = models.ImageField("Image", upload_to="images/")    
    upload_date=models.DateTimeField(auto_now_add =True)

# FileUpload form class.
class UploadForm(ModelForm):
    class Meta:
        model = Upload

9) mise à jour de views.py

from django.shortcuts import render
from uploader.models import UploadForm,Upload
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
# Create your views here.
def home(request):
    if request.method=="POST":
        img = UploadForm(request.POST, request.FILES)       
        if img.is_valid():
            img.save()  
            return HttpResponseRedirect(reverse('imageupload'))
    else:
        img=UploadForm()
    images=Upload.objects.all()
    return render(request,'home.html',{'form':img,'images':images})

10). Créer un dossier templates et de créer un fichier home.html:

<div style="padding:40px;margin:40px;border:1px solid #ccc">
    <h1>picture</h1>
    <form action="#" method="post" enctype="multipart/form-data">
        {% csrf_token %} {{form}} 
        <input type="submit" value="Upload" />
    </form>
    {% for img in images %}
        {{forloop.counter}}.<a href="{{ img.pic.url }}">{{ img.pic.name }}</a>
        ({{img.upload_date}})<hr />
    {% endfor %}
</div>

Arborescence du projet:

sample/
    manage.py
    sample/
        __init__.py
        settings.py
        urls.py
        wsgi.py             
    uploader/
        __init__.py
        models.py
        views.py            
        templates/
            home.html 

11). Synchroniser la base de données et runserver:

python manage.py syncdb
python manage.py runserver

visit <http://localhost.com:8000>

86voto

Henry Points 2992

En règle générale, lorsque vous essayez de "juste obtenir un exemple de travail", il est préférable de "juste de commencer à écrire le code'. Il n'y a pas de code ici pour vous aider, de sorte qu'il permet de répondre à la question beaucoup plus de travail pour nous.

Si vous voulez prendre un fichier, vous avez besoin de quelque chose comme cela dans un fichier html quelque part:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="myfile" />
    <input type="submit" name="submit" value="Upload" />
</form>

Qui vous donnera le bouton parcourir, un bouton télécharger pour commencer l'action (soumettre le formulaire) et notez le enctype donc Django sait vous donner des request.FILES

En vue quelque part, vous pouvez accéder au fichier avec

def myview(request):
    request.FILES['myfile'] # this is my file

Il y a une énorme quantité d'informations contenues dans le fichier télécharger des docs

Je vous recommande de lire la page à fond et commencer à écrire de code - ensuite revenir avec des exemples et des traces de pile quand ça ne fonctionne pas.

32voto

jimscafe Points 230

Je dois dire que je trouve la documentation de django à confusion. Aussi pour l'exemple le plus simple pourquoi sont des formes d'être mentionné? L'exemple que j'ai eu à travailler dans le views.py est :-

for key, file in request.FILES.items():
    path = file.name
    dest = open(path, 'w')
    if file.multiple_chunks:
        for c in file.chunks():
            dest.write(c)
    else:
        dest.write(file.read())
    dest.close()

Le fichier html ressemble le code ci-dessous, bien que cet exemple ne télécharge un fichier et le code pour enregistrer les handles de fichiers multiples:

<form action="/upload_file/" method="post" enctype="multipart/form-data">{% csrf_token %}
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

Ces exemples ne sont pas de mon code, ils ont été optained de deux autres exemples que j'ai trouvé. Je suis un parent débutant à django, il est donc très probable que je suis pas certains point clé.

17voto

Imran Points 20117

S'étendant sur Henry exemple:

import tempfile
import shutil

FILE_UPLOAD_DIR = '/home/imran/uploads'

def handle_uploaded_file(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
    return filepath

Vous pouvez appeler cette handle_uploaded_file fonction de votre point de vue avec le fichier téléchargé objet. Cela permettra d'enregistrer le fichier avec un nom unique (avec le préfixe de nom de fichier de l'original du fichier téléchargé) dans le système de fichiers et retour le chemin d'accès complet du fichier enregistré. Vous pouvez enregistrer le chemin d'accès dans la base de données, et de faire quelque chose avec le fichier plus tard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X