2015-12-10 11 views
8

enter image description heredjango1.8- jak dołączyć informację ręcznie podczas przesyłania Excel i wstawienie do bazy danych

Excel jest jak lewy obraz z 3 kolumnami.

Podczas wstawiania do bazy danych, muszę dodać ręcznie 2 kolumny bardziej ręcznie, jak pokazano na prawym obrazku i wstawić łącznie 5 kolumn w bazie danych. Te 2 dodatkowe informacje o kolumnach są pobierane z innych baz danych.

I kolejna funkcja, jeśli nie jest już istniejącego pliku, nowo dodany plik zastąpi istniejący. [Fragmenty w views.py poniżej]

Próbowałem już dwa 3 narzędzi firm, ale nie działa, więc może jeszcze lepiej jest po prostu użyć tego osadzonego w django.

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

Każda pomoc jest bardzo ceniona. Nadzieja mogłoby dostarczyć szczegółowy fragment o jak dołączyć te 2 kolumny:

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

dont połączyć się funkcja usuwania – maazza

+0

@maazza, mógłbyś wkleić poniżej swój poprawiony kod? dzięki. –

+0

Jak powiedział @maazza, utworzyłeś swoją funkcję, ale nie wywołujesz jej. Gdzieś w kodzie powinieneś go nazwać, żeby działał .. – qasimalbaqali

Odpowiedz

6

Może być tak:

nie prowadzę mój kod, to przykładem

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

Witam @ mrvol, faktycznie w końcu wziąłem inną metodę przy użyciu zapytania SQL Raw, to po prostu hack, ale przynajmniej mógł rozwiązać problemy. –

+0

@ Héléna Jeśli chcesz wstawić dane do bazy danych, to jest bardzo proste. Przede wszystkim musisz stworzyć model dla tych danych. To jest coś w rodzaju "Uploader, Date, Question, Choice, Vote". Po oczyszczeniu formularza wykonaj iterację pliku jak w przykładzie poniżej i utwórz listę z wartościami. Następnie zapisz swoją listę do DB, tak jak https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create – mrvol

Powiązane problemy