Fiuh, dokumentasi Django benar-benar tidak punya contoh bagus tentang ini. Saya menghabiskan lebih dari 2 jam untuk menggali semua bagian untuk memahami cara kerjanya. Dengan pengetahuan itu saya mengimplementasikan proyek yang memungkinkan untuk mengunggah file dan menunjukkannya sebagai daftar. Untuk mengunduh sumber untuk proyek ini, kunjungi https://github.com/axelpale/minimal-django-file-upload-example atau klonkan:
> git clone https://github.com/axelpale/minimal-django-file-upload-example.git
Pembaruan 2013-01-30: Sumber di GitHub juga menerapkan untuk Django 1.4 selain 1.3. Meskipun ada beberapa perubahan, tutorial berikut ini juga berguna untuk 1.4.
Pembaruan 2013-05-10: Implementasi untuk Django 1.5 di GitHub. Perubahan kecil dalam pengalihan di urls.py dan penggunaan tag templat url di list.html. Berkat hubert3 untuk usahanya.
Pembaruan 2013-12-07: Django 1.6 didukung di GitHub. Satu impor berubah di myapp / urls.py. Terima kasih kepada Arthedian .
Pembaruan 2015-03-17: Django 1.7 didukung di GitHub, terima kasih kepada aronysidoro .
Pembaruan 2015-09-04: Django 1.8 didukung di GitHub, terima kasih kepada nerogit .
Pembaruan 2016-07-03: Django 1.9 didukung di GitHub, terima kasih kepada daavve dan nerogit
Pohon proyek
Proyek Django 1.3 dasar dengan satu aplikasi dan media / direktori untuk diunggah.
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. Pengaturan: myproject / settings.py
Untuk mengunggah dan menyajikan file, Anda perlu menentukan di mana Django menyimpan file yang diunggah dan dari URL apa Django menyajikannya. MEDIA_ROOT dan MEDIA_URL secara default di setting.py tetapi kosong. Lihat baris pertama dalam Django Mengelola File untuk detailnya. Ingat juga atur database dan tambahkan myapp ke INSTALLED_APPS
...
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. Model: myproject / myapp / models.py
Selanjutnya Anda memerlukan model dengan FileField. Bidang khusus ini menyimpan file misalnya ke media / dokumen / 2011/12/24 / berdasarkan tanggal saat ini dan MEDIA_ROOT. Lihat referensi FileField .
# -*- coding: utf-8 -*-
from django.db import models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/%Y/%m/%d')
3. Formulir: myproject / myapp / forms.py
Untuk menangani unggahan dengan baik, Anda memerlukan formulir. Formulir ini hanya memiliki satu bidang tetapi itu sudah cukup. Lihat referensi Formulir FileField untuk detailnya.
# -*- coding: utf-8 -*-
from django import forms
class DocumentForm(forms.Form):
docfile = forms.FileField(
label='Select a file',
help_text='max. 42 megabytes'
)
4. Lihat: myproject / myapp / views.py
Tampilan di mana semua keajaiban terjadi. Perhatikan bagaimana request.FILES
penanganannya. Bagi saya, itu sangat sulit untuk menemukan fakta yang request.FILES['docfile']
dapat disimpan ke model. File hanya seperti itu. Save model () menangani penyimpanan file ke sistem file secara otomatis.
# -*- 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. URL Proyek: myproject / urls.py
Django tidak menayangkan MEDIA_ROOT secara default. Itu akan berbahaya di lingkungan produksi. Tetapi dalam tahap pengembangan, kita bisa memotong pendek. Perhatikan baris terakhir. Baris itu memungkinkan Django untuk menyajikan file dari MEDIA_URL. Ini hanya berfungsi pada tahap pengembangan.
Lihat referensi django.conf.urls.static.static untuk detailnya. Lihat juga diskusi ini tentang menyajikan file media .
# -*- 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. URL Aplikasi: myproject / myapp / urls.py
Agar tampilan dapat diakses, Anda harus menentukan url untuk itu. Tidak ada yang istimewa di sini.
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
url(r'^list/$', 'list', name='list'),
)
7. Templat: myproject / myapp / templates / myapp / list.html
Bagian terakhir: templat untuk daftar dan formulir unggahan di bawahnya. Formulir harus memiliki atribut enctype-set ke "multipart / form-data" dan metode set ke "posting" untuk memungkinkan unggahan ke Django. Lihat dokumentasi Upload File untuk detailnya.
FileField memiliki banyak atribut yang dapat digunakan dalam templat. Misalnya {{document.docfile.url}} dan {{document.docfile.name}} seperti pada templat. Lihat lebih lanjut tentang ini di Menggunakan file dalam artikel model dan dokumentasi objek File .
<!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. Inisialisasi
Jalankan saja syncdb dan runserver.
> cd myproject
> python manage.py syncdb
> python manage.py runserver
Hasil
Akhirnya semuanya siap. Pada lingkungan pengembangan Django default, daftar dokumen yang diunggah dapat dilihat di localhost:8000/list/
. Hari ini file diunggah ke / path / ke / myproject / media / dokumen / 2011/12/17 / dan dapat dibuka dari daftar.
Saya harap jawaban ini akan membantu seseorang sebanyak itu akan membantu saya.
{% url list %}
menjadi{% url "list" %}
.Secara umum ketika Anda mencoba untuk 'hanya mendapatkan contoh kerja' yang terbaik adalah 'mulai menulis kode'. Tidak ada kode di sini untuk membantu Anda, sehingga membuat menjawab pertanyaan lebih bermanfaat bagi kami.
Jika Anda ingin mengambil file, Anda perlu sesuatu seperti ini di file html di suatu tempat:
Itu akan memberi Anda tombol telusuri, tombol unggah untuk memulai tindakan (kirimkan formulir) dan catat enctype sehingga Django tahu untuk memberi Anda
request.FILES
Dalam tampilan di suatu tempat Anda dapat mengakses file
Ada sejumlah besar informasi dalam dokumen unggahan file
Saya sarankan Anda membaca halaman secara menyeluruh dan mulai menulis kode - kemudian kembali dengan contoh dan susun jejak ketika itu tidak berfungsi.
sumber
enctype="multipart/form-data"
apa yang saya butuhkan untuk membuat pekerjaan ini, terima kasih!Demo
Lihat repo github , bekerja dengan Django 3
Contoh unggah file Django minimal
1. Buat proyek Django
Jalankan startproject ::
sekarang folder ( contoh ) dibuat.
2. buat aplikasi
Buat aplikasi ::
Sekarang folder (
uploader
) dengan file-file ini dibuat ::3. Perbarui pengaturan.py
Pada
sample/settings.py
tambahkan'uploader'
keINSTALLED_APPS
dan tambahkanMEDIA_ROOT
danMEDIA_URL
, yaitu ::4. Perbarui urls.py
di
sample/urls.py
tambahkan ::5. Perbarui models.py
perbarui
uploader/models.py
::6. Perbarui views.py
perbarui
uploader/views.py
::7. buat template
Buat contoh folder / pengunggah / templat / pengunggah
Buat file upload_form.html yaitu
sample/uploader/templates/uploader/upload_form.html
::8. Sinkronkan basis data
Sinkronkan basis data dan runserver ::
kunjungi http: // localhost: 8000 /
sumber
FileField
sementara suhail menggunakanImageField
, bisakah seseorang tolong menjelaskan pilihannya?FileField
.ImageField
harus untuk hanya mengunggah gambar. pembaruan akan bekerja dengan Django 1.11.Saya harus mengatakan saya menemukan dokumentasi di Django membingungkan. Juga untuk contoh paling sederhana mengapa formulir disebutkan? Contoh saya bekerja di views.py adalah: -
File html terlihat seperti kode di bawah ini, meskipun contoh ini hanya mengunggah satu file dan kode untuk menyimpan banyak file: -
Contoh-contoh ini bukan kode saya, mereka telah memilih dari dua contoh lain yang saya temukan. Saya seorang pemula relatif untuk Django sehingga sangat mungkin saya kehilangan beberapa poin kunci.
sumber
FileField
dan amodel.Form
. Untuk pemula (dan untuk tugas-tugas sepele), pemrosesan manual dari file yang diunggah seperti yang ditunjukkan di atas kurang membingungkan.Saya juga punya persyaratan serupa. Sebagian besar contoh di internet meminta untuk membuat model dan membuat formulir yang tidak ingin saya gunakan. Ini kode terakhir saya.
Dan dalam HTML untuk mengunggah saya menulis:
Berikut ini adalah HTML yang menampilkan konten file:
sumber
Memperluas pada contoh Henry :
Anda dapat memanggil
handle_uploaded_file
fungsi ini dari tampilan Anda dengan objek file yang diunggah. Ini akan menyimpan file dengan nama unik (diawali dengan nama file dari file yang diunggah asli) dalam sistem file dan mengembalikan path lengkap file yang disimpan. Anda dapat menyimpan path dalam database, dan melakukan sesuatu dengan file nanti.sumber
request.FILES['myfile']
) kehandle_uploaded_file
, bukan objeknyarequest
sendiri.prefix=source.name
menambahkan karakter tambahan di akhir file, mengacaukan ekstensi file. Misalnyaupload.csv
diubah menjadiupload.csv5334
. Mengubahnya untuksuffix=source.name
memperbaikinya untuk saya.Di sini dapat membantu Anda: membuat bidang file di models.py Anda
Untuk mengunggah file (di admin.py Anda):
dan gunakan bidang itu di templat Anda juga.
sumber
Anda dapat merujuk ke contoh server di Pengunggah Baik, yang memiliki versi Django. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader
Ini sangat elegan dan yang paling penting dari semuanya, ia menyediakan fitur js lib. Template tidak termasuk dalam contoh server, tetapi Anda dapat menemukan demo di situs webnya. Pengunggah Baik: http://fineuploader.com/demos.html
django-fine-uploader
views.py
UploadView mengirimkan kiriman dan menghapus permintaan ke masing-masing penangan.
forms.py
sumber
Tidak yakin apakah ada kelemahan pada pendekatan ini tetapi bahkan lebih minimal, di views.py:
sumber
Saya menghadapi masalah yang sama, dan diselesaikan oleh situs admin Django.
sumber