2012-04-02 25 views
8

Necesito la interfaz de administrador de Django para aceptar cargas de administrador de archivos de Excel donde los datos en cada archivo de Excel se insertan en mis modelos de base de datos. ¿Cómo puedo hacer que aparezca un botón de "Subir" en una página de administrador modelo de Django, donde al hacer clic en el botón se solicita al administrador que elija un archivo .xls, cuyos datos luego se agregan a la base de datos una vez que se completa su carga?Importación de datos de Excel a modelos a través de django admin

+1

Esta es una gran pregunta, algo que otro desarrollador que conozco ha necesitado antes de Django, y que yo mismo necesito en uno de mis propios proyectos en este momento. La pregunta debe volver a abrirse para que podamos compartir cómo obtenemos la carga de Excel trabajando en la Interfaz de administración de Django. –

+0

Ah, y mientras tanto, hay una pregunta similar que las personas pueden consultar, pero que involucra el formato de archivo '.csv' en lugar del formato de archivo de Excel: http://stackoverflow.com/questions/3974620/ –

Respuesta

7

He hecho esto, pero configuré una vista simple con una carga de archivo (en realidad esto tiene más sentido que agregarlo directamente a una página de administración de Django, como una edición página = una instancia modelo, y supongo que su Excel contiene múltiples modelos).

en forms.py, un sencillo formulario con un campo de carga de archivos

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

en views.py, a fin de procesar la carga

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

y como se sugiere en la otra el uso post xlrd para leer los datos desde el archivo de Excel. Tengo un ExcelParser.py archivo separado para este

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

(Puedo añadir, que Excel es una forma propensos terrible, y de error para importar datos. Puedo hacer una gran cantidad de ella en mi trabajo, y estoy tratando de convencer a la gerencia de que hay soluciones mucho mejores.)

2

django-import-export podría ser útil.

Crea dos botones "importar" y "exportar" para objetos administrativos y permite seleccionar muchos tipos de extensiones, incluyendo xls. También muestra que los datos se importan y solicita confirmación antes de ejecutar la ejecución.

Solo necesita incluirlo en INSTALLED_APPS y crear un recurso de importación y exportación de la clase que desea cargar y una subclase de ImportExportModelAdmin relacionada con la clase de recurso creada anteriormente para mostrar botones en admin.

más información en:

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

Cuestiones relacionadas