Reikia minimalaus Django failo įkėlimo pavyzdžio

Kaip „Django“ naujokas, man sunku sukurti „Django“ 1.3 parsisiųsti programą. Negalėjau rasti naujo pavyzdžio / fragmentų. Ar kas nors gali siųsti minimalų, bet išsamų (modelio, peržiūros, modelio) pavyzdžio kodą?

586
03 мая '11 в 18:17 2011-05-03 18:17 nustatė qliq gegužės 03 '11, 18:17 2011-05-03 18:17
@ 10 atsakymų

Phew'e Django dokumentai tikrai neturi gerų pavyzdžių. Aš praleidau daugiau nei 2 valandas, kad galėčiau iškasti visus gabalus ir suprasti, kaip tai veikia. Dėl šių žinių aš įgyvendinau projektą, leidžiantį įkelti failus ir parodyti juos kaip sąrašą. Norėdami atsisiųsti projekto šaltinio kodą, apsilankykite https://github.com/axelpale/minimal-django-file-upload-example arba clone:

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

Atnaujinimas 2013-01-30: „GitHub“ šaltinis taip pat turi diegimą „Django 1.4“, be 1.3. Nepaisant nedidelio pakeitimų skaičiaus, ši pamoka taip pat naudinga 1.4 versijai.

Atnaujinimas 2013-05-10: „ Django 1.5“ diegimas „GitHub“. Mažesni pakeitimai perkeliami į urls.py ir naudojant URL šablono žymę list.html. Ačiū hubert3 už pastangas.

Atnaujinimas 2013-12-07: „GjanHub“ palaiko „Django 1.6“. Vienas importas pasikeitė „myapp / urls.py“. Ačiū, Arthedian .

Atnaujinimas 2015-03-17: „ Django 1.7“ yra palaikomas „GitHub“, nes tai yra aronysidoro .

Atnaujinimas 2015-09-04: „ Django“ 1.8 „GitHub“ palaiko „ nerogit“ . p>

Atnaujinimas 2016-07-03: „ Django 1.9“ yra palaikomas „GitHub“ dėka „ daavve“ ir „ nerogit“

Projekto medis

Django 1.3 pagrindinis projektas su vienu programų ir medijos / atsisiuntimo katalogu.

 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. Parametrai: myproject / settings.py

Norėdami įkelti ir prižiūrėti failus, reikia nurodyti, kur Django saugo atsisiųstus failus ir iš kurių URL Django juos aptarnauja. „MEDIA_ROOT“ ir „MEDIA_URL“ pagal nutylėjimą yra answer.py, tačiau jos yra tuščios. Išsamesnės informacijos žr. „ Django rinkmenų valdymo pirmosios eilutės“. Taip pat nepamirškite įdiegti duomenų bazės ir pridėti myapp į 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. Modelis: myproject / myapp / models.py

Tada jums reikia modelio su failo lauku. Pavyzdžiui, failai saugomi šiame konkrečiame lauke. žiniasklaidoje / dokumentuose / 2011/12/24 / remiantis dabartine data ir MEDIA_ROOT. Žr. „ FileField“ nuorodą .

 # -*- coding: utf-8 -*- from django.db import models class Document(models.Model): docfile = models.FileField(upload_to='documents/%Y/%m/%d') 

3. Forma: myproject / myapp / forms.py

Patogiam krovimo procesui reikalinga forma. Ši forma turi tik vieną lauką, bet to pakanka. Išsamesnės informacijos ieškokite „ FileField File Link“ .

 # -*- coding: utf-8 -*- from django import forms class DocumentForm(forms.Form): docfile = forms.FileField( label='Select a file', help_text='max. 42 megabytes' ) 

4. Žiūrėti: myproject / myapp / views.py

Žiūrėti, kur įvyksta visa magija. Atkreipkite dėmesį, kaip tvarkomi request.FILES . Man buvo labai sunku pastebėti, kad request.FILES['docfile'] gali būti išsaugoti modeliuose. „FileField“ taip pat. Išsaugoti () modelis automatiškai išsaugo failą failų sistemoje.

 # -*- 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. Projekto URL: myproject / urls.py

Pagal nutylėjimą „Django“ nepalaiko „MEDIA_ROOT“. Tai būtų pavojinga gamybos aplinkoje. Tačiau plėtros etape galėtume nutraukti. Atkreipkite dėmesį į paskutinę eilutę. Ši eilutė leidžia „Django“ pateikti failus iš „MEDIA_URL“. Tai veikia tik kūrimo etape.

Daugiau informacijos rasite django.conf.urls.static.static nuorodoje . Taip pat žiūrėkite šią diskusiją apie multimedijos failų aptarnavimą .

 # -*- 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. Programos URL: myproject / myapp / urls.py

Jei norite matyti vaizdą, turite nurodyti jo URL. Čia nėra nieko ypatingo.

 # -*- coding: utf-8 -*- from django.conf.urls import patterns, url urlpatterns = patterns('myapp.views', url(r'^list/$', 'list', name='list'), ) 

7. Šablonas: myproject / myapp / templates / myapp / list.html

Paskutinė dalis: sąrašo šablonas ir užpildymo forma pagal jį. Forma turi būti „enctype“ atributas „multipart / form-data“ ir metodas, nustatytas „post“, kad būtų galima įkelti „Django“. Išsamesnės informacijos ieškokite Failų atsisiuntimas .

„FileField“ yra daug atributų, kuriuos galite naudoti šablonuose. Pavyzdžiui. {{document.docfile.url}} ir {{document.docfile.name}}, kaip ir šablone. Daugiau informacijos apie tai žr. Failo naudojimas modelio straipsnyje ir failų failų dokumentuose .

 <!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. Pradėti

Tiesiog paleiskite „syncdb“ ir „runerver“.

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

Rezultatai

Galiausiai viskas yra paruošta. Numatytoje „Django“ kūrimo aplinkoje atsisiųstų dokumentų sąrašą galima pamatyti „ localhost:8000/list/ . Šiandien failai įkeliami į / path / to / myproject / media / documents / 2011/12/17 / ir gali būti atidaryti iš sąrašo.

Tikiuosi, kad šis atsakymas padės kitiems, kaip aš.

1200
17 дек. Atsakymą pateikė Akseli Palén gruodžio 17 d. 2011-12-17 04:59 '11, 4:59, 2011-12-17 04:59

Apskritai, kai bandote „tiesiog gauti darbo pavyzdį“, geriausia yra „pradėti rašyti kodą“. Nėra kodo, kuris padėtų jums, todėl jis mums atsako daug daugiau.

Jei norite užfiksuoti failą, html faile kažką reikia panašaus:

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

Tai suteiks jums naršymo mygtuką, atsisiuntimo mygtuką, kad pradėtumėte veiksmą (pateikite formą), ir pažiūrėkite į enctype, kad „Django“ žinotų, kad duos jums request.FILES

border=0

Kai kur galite peržiūrėti failą naudodami

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

Failų įkėlimo failuose yra daug informacijos.

Aš rekomenduoju atidžiai perskaityti puslapį ir tiesiog pradėti rašyti kodą, tada grįžti su pavyzdžiais ir kamino pėdsakais, kai tai neveikia.

59
03 мая '11 в 18:25 2011-05-03 18:25 atsakymą pateikė Henry, gegužės 03 d. 11 val. 18:25 2011-05-03 18:25

demonstravimas

Atnaujinkite atsakymą Axeli Palen . žr. „ Github“ saugyklą , dirba su „ Django“ 2

Minimalus Django failo atsisiuntimo pavyzdys

1. Sukurkite „django“ projektą

Pradėti projektą ::

 $ django-admin.py startproject sample 

dabar sukurtas aplankas ( pavyzdys ) ::

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

2. sukurkite programą

Kurti programą ::

 $ cd sample $ python manage.py startapp uploader 

Dabar su šiais failais sukuriamas aplankas ( uploader ):

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

3. Atnaujinkite settings.py

MEDIA_ROOT sample/settings.py pridėkite 'uploader.apps.UploaderConfig' į INSTALLED_APPS ir pridėkite MEDIA_ROOT ir MEDIA_URL , tai yra:

 INSTALLED_APPS = [ ...<other apps>... 'uploader.apps.UploaderConfig', ] MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' 

4. Atnaujinkite URL

sample/urls.py add ::

 ...<other imports>... from django.conf import settings from django.conf.urls.static import static from uploader import views as uploader_views urlpatterns = [ ...<other url patterns>... path('', uploader_views.home, name='imageupload'), ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

5. Atnaujinti modelius.py

atnaujinti uploader/models.py ::

 from django.db import models from django.forms import ModelForm class Upload(models.Model): pic = models.FileField(upload_to="images/") upload_date=models.DateTimeField(auto_now_add =True) # FileUpload form class. class UploadForm(ModelForm): class Meta: model = Upload fields = ('pic',) 

6. Atnaujinkite peržiūrą.py

atnaujinti uploader/views.py ::

 from django.shortcuts import render from uploader.models import UploadForm,Upload from django.http import HttpResponseRedirect from django.urls 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().order_by('-upload_date') return render(request,'home.html',{'form':img,'images':images}) 

7. Šablonų kūrimas

Sukurkite aplanko šablonus įkėlimo aplanke, tada sukurkite home.html failą, t. Y.

 <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> 

8. Sinchronizuokite duomenų bazę

Sinchronizuokite duomenų bazę ir paleidimo serverius:

 $ python manage.py makemigrations $ python manage.py migrate $ python manage.py runserver 

apsilankykite http://localhost.com:8000

54
05 июня '14 в 20:10 2014-06-05 20:10 atsakymas pateikiamas suhailvs birželio 5 d. 14 d. 20:10 2014-06-05 20:10

Turiu pasakyti, kad dokumentai buvo surasti painiai. Be to, paprasčiausias pavyzdys, kodėl yra minėtos formos? Pavyzdys, kurį turėjau dirbti peržiūros metu.py: -

 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() 

HTML failas atrodo kaip toliau nurodytas kodas, nors šiame pavyzdyje yra įkeltas tik vienas failas, o failų išsaugojimo kodas tvarko daugelį: -

 <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> 

Šie pavyzdžiai nėra mano kodas, jie buvo gauti iš dviejų kitų rastų pavyzdžių. Aš esu santykinis naujokas į „django“, todėl greičiausiai trūksta pagrindinio taško.

22
07 июня '12 в 15:11 2012-06-07 15:11 Atsakymą pateikė jimscafe birželio 12 d. 12 val. 15:11 2012-06-07 15:11

Tęsiant Henrio pavyzdį :

 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 

Jūs galite skambinti šiai funkcijai handle_uploaded_file iš jūsų handle_uploaded_file failo objekto. Tokiu būdu failų sistemoje failas bus išsaugotas unikaliu pavadinimu (su pradinio failo pavadinimo prefiksu) ir grąžinamas visas kelias į išsaugotą failą. Jūs galite išsaugoti kelią į duomenų bazę ir vėliau ką nors padaryti.

14
03 мая '11 в 18:42 2011-05-03 18:42 atsakymas pateikiamas Imran 03 gegužės 11 d. 18:42 2011-05-03 18:42

Čia galite jums padėti: sukurti failą.py

Jei norite atsisiųsti failą (jūsų admin.py):

 def save_model(self, request, obj, form, change): url = "http://img.youtube.com/vi/%s/hqdefault.jpg" %(obj.video) url = str(url) if url: temp_img = NamedTemporaryFile(delete=True) temp_img.write(urllib2.urlopen(url).read()) temp_img.flush() filename_img = urlparse(url).path.split('/')[-1] obj.image.save(filename_img,File(temp_img) 

ir taip pat naudokite šį lauką savo šablone.

10
20 окт. atsakymą pateikė Vijesh Venugopal 20 okt. 2013-10-20 13:39 '13 13:39 2013-10-20 13:39

Serverio pavyzdžius galite rasti „Fine Uploader“, kuris yra „django“ versijoje. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader

Tai labai elegantiškas ir, svarbiausia, yra pripažintas js lib. Šablonas nėra įtrauktas į mėginių serverius, tačiau galite rasti demo svetainėje. Puikus įkėlėjas: http://fineuploader.com/demos.html

Django plonas krautuvas

peržiūros.py

UploadView siunčia pranešimus ir ištrina užklausas atitinkamiems tvarkytojams.

 class UploadView(View): @csrf_exempt def dispatch(self, *args, **kwargs): return super(UploadView, self).dispatch(*args, **kwargs) def post(self, request, *args, **kwargs): """A POST request. Validate the form and then handle the upload based ont the POSTed data. Does not handle extra parameters yet. """ form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): handle_upload(request.FILES['qqfile'], form.cleaned_data) return make_response(content=json.dumps({ 'success': True })) else: return make_response(status=400, content=json.dumps({ 'success': False, 'error': '%s' % repr(form.errors) })) def delete(self, request, *args, **kwargs): """A DELETE request. If found, deletes a file with the corresponding UUID from the server filesystem. """ qquuid = kwargs.get('qquuid', '') if qquuid: try: handle_deleted_file(qquuid) return make_response(content=json.dumps({ 'success': True })) except Exception, e: return make_response(status=400, content=json.dumps({ 'success': False, 'error': '%s' % repr(e) })) return make_response(status=404, content=json.dumps({ 'success': False, 'error': 'File not present' })) 

form.py

 class UploadFileForm(forms.Form): """ This form represents a basic request from Fine Uploader. The required fields will **always** be sent, the other fields are optional based on your setup. Edit this if you want to add custom parameters in the body of the POST request. """ qqfile = forms.FileField() qquuid = forms.CharField() qqfilename = forms.CharField() qqpartindex = forms.IntegerField(required=False) qqchunksize = forms.IntegerField(required=False) qqpartbyteoffset = forms.IntegerField(required=False) qqtotalfilesize = forms.IntegerField(required=False) qqtotalparts = forms.IntegerField(required=False) 
9
07 апр. Atsakymą pateikė Jiawei Dai 07 Bal 2015-04-07 07:35 '15 at 7:35 2015-04-07 07:35

Taip pat turėjau panašų reikalavimą. Dauguma žiniatinklio pavyzdžių prašo sukurti modelius ir kurti formas, kurių nenorėjau naudoti. Čia yra mano galutinis kodas.

 if request.method == 'POST': file1 = request.FILES['file'] contentOfFile = file1.read() if file1: return render(request, 'blogapp/Statistics.html', {'file': file1, 'contentOfFile': contentOfFile}) 

Ir atsisiunčiamame HTML faile parašiau:

 {% block content %} <h1>File content</h1> <form action="{% url 'blogapp:uploadComplete'%}" method="post" enctype="multipart/form-data"> {% csrf_token %} <input id="uploadbutton" type="file" value="Browse" name="file" accept="text/csv" /> <input type="submit" value="Upload" /> </form> {% endblock %} 

Žemiau yra HTML, kuriame rodomas failo turinys:

 {% block content %} <h3>File uploaded successfully</h3> {{file.name}} </br>content = {{contentOfFile}} {% endblock %} 
9
10 нояб. atsakymas pateikiamas chetan pawar 10 lapkričio. 2014-11-10 05:16 '14, 5:16 2014-11-10 05:16

Nesate tikri, ar yra kokių nors šio požiūrio trūkumų, bet dar labiau minimalūs, peržiūros metu.py:

 entry = form.save() # save uploaded file if request.FILES['myfile']: entry.myfile.save(request.FILES['myfile']._name, request.FILES['myfile'], True) 
5
19 мая '11 в 16:00 2011-05-19 16:00 atsakymas duotas PhoebeB gegužės 19 d., 11 val

Susidūriau su panašia problema ir išsprendžiau „django“ administratoriaus svetainę.

 # models class Document(models.Model): docfile = models.FileField(upload_to='documents/Temp/%Y/%m/%d') def doc_name(self): return self.docfile.name.split('/')[-1] # only the name, not full path # admin from myapp.models import Document class DocumentAdmin(admin.ModelAdmin): list_display = ('doc_name',) admin.site.register(Document, DocumentAdmin) 
0
14 мая '14 в 9:58 2014-05-14 09:58 atsakymas pateikiamas hlpmee gegužės 14, 14, 9:58 2014-05-14 09:58

Kiti klausimai apie žymos arba Užduoti klausimą