Puh, die Django-Dokumentation hat wirklich kein gutes Beispiel dafür. Ich habe über 2 Stunden damit verbracht, alle Teile auszugraben, um zu verstehen, wie das funktioniert. Mit diesem Wissen habe ich ein Projekt implementiert, das es ermöglicht, Dateien hochzuladen und als Liste anzuzeigen. Um die Quelle für das Projekt herunterzuladen, besuchen Sie https://github.com/axelpale/minimal-django-file-upload-example oder klonen Sie sie:
> git clone https://github.com/axelpale/minimal-django-file-upload-example.git
Update 30.01.2013: Die Quelle bei GitHub hat neben 1.3 auch eine Implementierung für Django 1.4. Obwohl es nur wenige Änderungen gibt, ist das folgende Tutorial auch für 1.4 nützlich.
Update 10.05.2013: Implementierung für Django 1.5 bei GitHub. Kleinere Änderungen bei der Umleitung in urls.py und Verwendung des URL-Vorlagen-Tags in list.html. Danke an hubert3 für die Mühe.
Update 07.12.2013: Django 1.6 wird bei GitHub unterstützt. Ein Import wurde in myapp / urls.py geändert. Danke geht an Arthedian .
Update 17.03.2015: Django 1.7 wird dank aronysidoro bei GitHub unterstützt .
Update 04.09.2015: Django 1.8 wird dank nerogit bei GitHub unterstützt .
Update 03.07.2016: Django 1.9 wird bei GitHub dank Daavve und Nerogit unterstützt
Projektbaum
Ein einfaches Django 1.3-Projekt mit einer einzigen App und einem Medien- / Verzeichnis zum Hochladen.
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. Einstellungen: myproject / settings.py
Um Dateien hochzuladen und bereitzustellen, müssen Sie angeben, wo Django hochgeladene Dateien speichert und von welcher URL Django sie bereitstellt. MEDIA_ROOT und MEDIA_URL befinden sich standardmäßig in settings.py, sind jedoch leer. Weitere Informationen finden Sie in den ersten Zeilen in Django Managing Files . Denken Sie daran, auch die Datenbank festzulegen und myapp zu INSTALLED_APPS hinzuzufügen
...
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'database.sqlite3'),
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
...
INSTALLED_APPS = (
...
'myapp',
)
2. Modell: myproject / myapp / models.py
Als nächstes benötigen Sie ein Modell mit einem FileField. In diesem speziellen Feld werden Dateien gespeichert, z. B. in Medien / Dokumenten / 2011/12/24 / basierend auf dem aktuellen Datum und MEDIA_ROOT. Siehe FileField-Referenz .
# -*- coding: utf-8 -*-
from django.db import models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/%Y/%m/%d')
3. Formular: myproject / myapp / forms.py
Um den Upload gut zu handhaben, benötigen Sie ein Formular. Dieses Formular hat nur ein Feld, aber das reicht aus. Weitere Informationen finden Sie in der Referenz zu Form FileField .
# -*- coding: utf-8 -*-
from django import forms
class DocumentForm(forms.Form):
docfile = forms.FileField(
label='Select a file',
help_text='max. 42 megabytes'
)
4. Ansicht: myproject / myapp / views.py
Eine Ansicht, in der all die Magie passiert. Achten Sie darauf, wie request.FILES
damit umgegangen wird. Für mich war es wirklich schwer zu erkennen, dass request.FILES['docfile']
es in Modellen gespeichert werden kann. FileField einfach so. Mit save () des Modells wird die Datei automatisch im Dateisystem gespeichert.
# -*- 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. Projekt-URLs: myproject / urls.py
Django bedient standardmäßig nicht MEDIA_ROOT. Das wäre in der Produktionsumgebung gefährlich. Aber in der Entwicklungsphase könnten wir abkürzen. Achten Sie auf die letzte Zeile. Diese Zeile ermöglicht es Django, Dateien von MEDIA_URL bereitzustellen. Dies funktioniert nur in der Entwicklungsphase.
Weitere Informationen finden Sie in der Referenz zu django.conf.urls.static.static . Siehe auch diese Diskussion zum Bereitstellen von Mediendateien .
# -*- coding: utf-8 -*-
from django.conf.urls 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-URLs: myproject / myapp / urls.py
Um die Ansicht zugänglich zu machen, müssen Sie URLs dafür angeben. Hier ist nichts Besonderes.
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
url(r'^list/$', 'list', name='list'),
)
7. Vorlage: myproject / myapp / templates / myapp / list.html
Der letzte Teil: Vorlage für die Liste und das Upload-Formular darunter. Das Formular muss ein enctype-Attribut auf "multipart / form-data" und eine Methode auf "post" setzen, um das Hochladen nach Django zu ermöglichen. Weitere Informationen finden Sie in der Dokumentation zum Hochladen von Dateien .
Das FileField verfügt über viele Attribute, die in Vorlagen verwendet werden können. ZB {{document.docfile.url}} und {{document.docfile.name}} wie in der Vorlage. Weitere Informationen hierzu finden Sie im Artikel Verwenden von Dateien in Modellen und in der Dokumentation zum Dateiobjekt .
<!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. Initialisieren
Führen Sie einfach syncdb und runserver aus.
> cd myproject
> python manage.py syncdb
> python manage.py runserver
Ergebnisse
Endlich ist alles fertig. In der Standard-Django-Entwicklungsumgebung kann die Liste der hochgeladenen Dokumente unter angezeigt werden localhost:8000/list/
. Heute werden die Dateien nach / path / to / myproject / media / documents / 2011/12/17 / hochgeladen und können aus der Liste geöffnet werden.
Ich hoffe, diese Antwort hilft jemandem so sehr, wie es mir geholfen hätte.
{% url list %}
wird{% url "list" %}
.Wenn Sie versuchen, nur ein funktionierendes Beispiel zu erhalten, ist es im Allgemeinen am besten, einfach mit dem Schreiben von Code zu beginnen. Es gibt hier keinen Code, der Ihnen dabei hilft, sodass die Beantwortung der Frage für uns viel einfacher ist.
Wenn Sie eine Datei abrufen möchten, benötigen Sie irgendwo in einer HTML-Datei Folgendes:
Dadurch erhalten Sie die Schaltfläche zum Durchsuchen, eine Schaltfläche zum Hochladen, um die Aktion zu starten (senden Sie das Formular) und den Enctype zu notieren, damit Django Sie kennen kann
request.FILES
In einer Ansicht irgendwo können Sie mit auf die Datei zugreifen
Die Datei-Upload-Dokumente enthalten eine Vielzahl von Informationen
Ich empfehle Ihnen, die Seite gründlich zu lesen und einfach mit dem Schreiben von Code zu beginnen. Geben Sie dann Beispiele und Stapelspuren zurück, wenn dies nicht funktioniert.
quelle
enctype="multipart/form-data"
was ich brauchte, um diese Arbeit zu machen, danke!Demo
Siehe das Github-Repo , funktioniert mit Django 3
Ein minimales Beispiel für das Hochladen von Django-Dateien
1. Erstellen Sie ein Django-Projekt
Führen Sie startproject :: aus.
Jetzt wird ein Ordner ( Beispiel ) erstellt.
2. Erstellen Sie eine App
Erstellen Sie eine App ::
Nun wird ein Ordner (
uploader
) mit diesen Dateien erstellt ::3. Aktualisieren Sie settings.py
Auf
sample/settings.py
Add'uploader'
zuINSTALLED_APPS
und fügenMEDIA_ROOT
undMEDIA_URL
, dh ::4. Aktualisieren Sie urls.py
in
sample/urls.py
add ::5. Aktualisieren Sie models.py
update
uploader/models.py
::6. Aktualisieren Sie views.py
update
uploader/views.py
::7. Vorlagen erstellen
Erstellen Sie einen Ordner sample / uploader / templates / uploader
Erstellen Sie eine Datei upload_form.html dh
sample/uploader/templates/uploader/upload_form.html
::8. Datenbank synchronisieren
Synchronisieren Sie Datenbank und Runserver ::
Besuchen Sie http: // localhost: 8000 /
quelle
FileField
Weile suhail benutzte eineImageField
, könnte jemand bitte die Entscheidungen erklären?FileField
.ImageField
muss nur für bild hochladen. Das Update funktioniert mit Django 1.11.Ich muss sagen, ich finde die Dokumentation bei Django verwirrend. Auch für das einfachste Beispiel, warum werden Formulare erwähnt? Das Beispiel, das ich in views.py arbeiten musste, ist: -
Die HTML-Datei sieht wie folgt aus: In diesem Beispiel wird jedoch nur eine Datei hochgeladen, und der Code zum Speichern der Dateien verarbeitet viele: -
Diese Beispiele sind nicht mein Code, sie wurden aus zwei anderen Beispielen ausgewählt, die ich gefunden habe. Ich bin ein relativer Anfänger von Django, daher ist es sehr wahrscheinlich, dass mir ein wichtiger Punkt fehlt.
quelle
FileField
und amodel.Form
. Für Anfänger (und für triviale Aufgaben) ist die manuelle Verarbeitung hochgeladener Dateien wie oben gezeigt weniger verwirrend.Ich hatte auch die ähnliche Anforderung. Die meisten Beispiele im Internet fordern das Erstellen von Modellen und Formularen, die ich nicht verwenden wollte. Hier ist mein endgültiger Code.
Und in HTML zum Hochladen schrieb ich:
Das Folgende ist der HTML-Code, der den Inhalt der Datei anzeigt:
quelle
Erweiterung auf Henrys Beispiel :
Sie können diese
handle_uploaded_file
Funktion aus Ihrer Sicht mit dem hochgeladenen Dateiobjekt aufrufen . Dadurch wird die Datei unter einem eindeutigen Namen (vorangestellt mit dem Dateinamen der ursprünglich hochgeladenen Datei) im Dateisystem gespeichert und der vollständige Pfad der gespeicherten Datei zurückgegeben. Sie können den Pfad in der Datenbank speichern und später etwas mit der Datei tun.quelle
request.FILES['myfile']
) anhandle_uploaded_file
, nicht an dasrequest
selbst.prefix=source.name
wurden zusätzliche Zeichen am Ende der Datei hinzugefügt, wodurch die Dateierweiterung durcheinander gebracht wurde. ZBupload.csv
wurde geändert zuupload.csv5334
. Ändern Sie es, umsuffix=source.name
es für mich zu beheben.Hier kann es Ihnen helfen: Erstellen Sie ein Dateifeld in Ihrer models.py
Zum Hochladen der Datei (in Ihrer admin.py):
und verwenden Sie dieses Feld auch in Ihrer Vorlage.
quelle
Sie können auf Serverbeispiele in Fine Uploader verweisen, das die Django-Version hat. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader
Es ist sehr elegant und vor allem bietet es eine vorgestellte js lib. Vorlage ist nicht in Server-Beispielen enthalten, aber Sie können Demo auf seiner Website finden. Feiner Uploader: http://fineuploader.com/demos.html
Django-Fein-Uploader
views.py
UploadView sendet Post- und Löschanforderungen an die jeweiligen Handler.
forms.py
quelle
Ich bin mir nicht sicher, ob dieser Ansatz Nachteile hat, aber in views.py noch minimaler:
quelle
Ich stand vor einem ähnlichen Problem und wurde von der Django-Admin-Site gelöst.
quelle