2015-12-10 8 views
8

enter image description heredjango1.8- come aggiungere manualmente le informazioni durante il caricamento di Excel e l'inserimento nel database

L'Excel è come l'immagine di sinistra con 3 colonne.

Quando si inserisce nel database, è necessario aggiungere 2 colonne in modo più manuale come mostrato nell'immagine a destra e inserire complessivamente 5 colonne nel database. Queste 2 ulteriori informazioni sulle colonne sono recuperate da altri database.

E un'altra funzione è se c'è già file esistente, il file appena caricato sovrascriverà quella esistente. [Frammenti in views.py sotto]

Ho già provato due 3 strumenti di terze parti, ma non funziona, in modo da forse è ancora meglio usare solo quello incorporato nel django.

Versione: Python 2.7. Excel 2013. Django1.8.

Qualsiasi aiuto è molto apprezzato. La speranza potrebbe fornire il frammento di dettaglio per come aggiungere questi 2 colonne:

uploader = request.session['uploader'] 
Date=request.session['date'] 

forms.py

from django.core.files.storage import FileSystemStorage 
from financialdata.storage import OverwriteStorage 

class XXXXDataForm(forms.Form): 
    XXXXfile=forms.FileField(label='Select a file') 

views.py

from django.core.files.storage import FileSystemStorage 

def import_data(request): 
    if request.method == "POST": 
     form = XXXXForm(request.POST,request.FILES) 
     if form.is_valid(): 
      newdoc= XXXX(docfile=request.FILES['docfile']) 
      newdoc.save() 
      return HttpResponseRedirect(reverse('homepage')) 
     else: 
      return HttpResponseBadRequest() 
    else: 
     form = XXXXForm() 
    return render_to_response(
     'dataentry.html', 
     { 
      'form': form, 
      'title': 'Import excel data into database example', 
      'header': 'Please upload XXXX.xlsx:', 
      'message': 'File Saved!' 
     }, 
     context_instance=RequestContext(request)) 

<!--How can I embed the following part to previous part?--> 

class OverwriteStorage(FileSystemStorage): 
    def _save(self, name, content): 
     if self.exists(name): 
      self.delete(name) 
     return super(OverwriteStorage, self)._save(name, content) 

    def get_available_name(self, name): 
     return name 
+0

tu non chiamare la funzione di eliminazione – maazza

+0

@maazza, la prego di incollare il codice corretto di seguito? Grazie. –

+0

Come ha detto @maazza, hai creato la tua funzione, ma non la chiami. Da qualche parte nel codice dovresti chiamarlo in modo che funzioni .. – qasimalbaqali

risposta

6

Può essere così:

non corro il mio codice, è un esempio

if request.method == "POST": 
     form = XXXXForm(request.POST,request.FILES) 
     if form.is_valid(): 
      docfile=request.FILES['docfile']

  if isinstance(docfile, (InMemoryUploadedFile, TemporaryUploadedFile)): 
      book = xlrd.open_workbook(file_contents=docfile.read(), formatting_info=True, on_demand=True) 
     else: 
      book = xlrd.open_workbook(filename=docfile, formatting_info=True, on_demand=True) 

     sheet = book.sheet_by_index(0) 
     new_csv_file = csv.writer(open('new_filename', 'w')) 
     # read file 
     for line in range(1, sheet.nrows): 
      new_row = [request.session.get('uploader'), request.session.get('date')] 
      new_row.extend(sheet.row_values(line))     
      new_csv_file.writerow(new_row) 

...

+0

Ciao @mrvol, in realtà finalmente ho preso un altro metodo usando la query raw SQL, è solo un hack, ma almeno potrebbe risolvere i problemi. –

+0

@ Héléna Se vuoi inserire dati DB, è più facile. Prima di tutto, è necessario creare un modello per questi dati. Questo è qualcosa di simile con campi 'Uploader, Data, Domanda, Scelta, Vota'. Dopo la pulizia del modulo, fai scorrere il file come nell'esempio seguente e crea un elenco con valori. Quindi salva la tua lista in DB come questa https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create – mrvol

Problemi correlati