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.
Réponses
Trop de publicités?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.
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>
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.
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é.
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.