2012-04-02 9 views
8

Ho bisogno che l'interfaccia di Django Admin accetti gli upload di amministratore dei file Excel in cui i dati in ogni file Excel vengono inseriti nei miei modelli di database. Come posso visualizzare un pulsante "Upload" su una pagina di amministrazione del modello Django, in cui il clic sul pulsante chiede all'amministratore di scegliere un file .xls, i cui dati vengono quindi aggiunti al database una volta completato il caricamento?Importare dati excel in modelli tramite admin django

+1

Questa è una grande domanda - qualcosa che un altro sviluppatore che conosco ha avuto bisogno in precedenza di Django, e che io stesso ho bisogno in uno dei miei progetti in questo momento. La domanda dovrebbe essere riaperta in modo che possiamo condividere il modo in cui il caricamento di Excel funziona sull'interfaccia di Django Admin. –

+0

Oh - e, nel frattempo, c'è una domanda simile che le persone possono consultare, ma che coinvolge il formato di file '.csv' invece del formato di file Excel: http://stackoverflow.com/questions/3974620/ –

risposta

4

Non sono sicuro del lato Django delle cose, ma è possibile utilizzare xlrd per leggere e manipolare i file di Excel. C'è un PDF gratuito che spiega questo chiamato Working with Excel files in Python

7

Ho fatto questo, ma ho appena impostato una semplice visualizzazione con un caricamento di file (in realtà questo ha più senso che aggiungerlo direttamente in una pagina di amministrazione Django, come una modifica page = un'istanza di modello e presumo che il tuo excel contenga più modelli).

in forms.py, un semplice modulo con un campo di caricamento file

class ImportExcelForm(forms.Form): 
    file = forms.FileField(label= "Choose excel to upload")  

in views.py, al fine di elaborare il caricamento

def test_flowcell(request): 
    c = RequestContext(request, {'other_context':'details here'}) 
    if request.method == 'POST': # If the form has been submitted... 
     form = ImportExcelForm(request.POST, request.FILES) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      excel_parser= ExcelParser() 
      success, log = excel_parser.read_excel(request.FILES['file']) 
      if success: 
       return redirect(reverse('admin:index') + "pages/flowcell_good/") ## redirects to aliquot page ordered by the most recent 
      else: 
       errors = '* Problem with flowcell * <br><br>log details below:<br>' + "<br>".join(log) 
       c['errors'] = mark_safe(errors) 
     else: 
      c['errors'] = form.errors 
    else: 
     form = ImportExcelForm() # An unbound form 
    c['form'] = form 
    return render_to_response('sequencing/file_upload.html') 

e come suggerito in un altro uso post xlrd per leggere i dati dal file excel. Ho un ExcelParser.py file separato per questo

import xlrd 

class ExcelParser(object, excel_name): 
    @transaction.commit_on_success   
    def read_excel(self): 
     wb = xlrd.open_workbook(excel_name) 

     ... 
     do your parsing in here..... 
     ... 

(Posso aggiungere, che Excel è un modo incline terribile, e l'errore per importare i dati. Faccio un sacco di esso al mio lavoro, e sto cercando di convincere il management che ci sono soluzioni migliori.)

2

django-import-export potrebbe essere utile.

Crea due pulsanti "importa" e "esporta" per oggetti di amministrazione e consente di selezionare molti tipi di estensioni, inclusi xls. Mostra anche i dati da importare e chiede di essere confermato prima di eseguire l'esecuzione.

È sufficiente includerlo in INSTALLED_APPS e creare una risorsa di importazione/esportazione della classe che si desidera caricare e una sottoclasse di ImportExportModelAdmin correlata alla classe di risorse creata in precedenza per mostrare i pulsanti nell'admin. più

info at:

http://django-import-export.readthedocs.org/en/latest/getting_started.html https://github.com/bmihelac/django-import-export.