2012-05-15 25 views
5

Mi FormWizard (Django 1.4) permite al usuario avanzar y retroceder hasta que complete el asistente. El asistente mantiene todos los valores que el usuario completó y los muestra en caso de que el usuario regrese a un paso que ya completó.FormWizard y FileFields (Django 1.4)

Esto funciona bien, es decir, para CharField pero no funciona para FileFields. En caso de que el usuario envíe un archivo en un paso que contenga un FileField y luego vuelva a este paso, debe subir un archivo nuevamente.

¿Hay alguna manera en que el usuario no tenga que volver a subir el archivo?

Tenga en cuenta que los datos del formulario aún no se han guardado en la base de datos.

Respuesta

2

Recientemente me encontré con el mismo problema, y ​​pude resolverlo subclasificando SessionWizardView de Django (en mi caso NamedUrlSessionWizardView), y anulando el método get_form.

Básicamente yo hago lo siguiente:

  • obtener los archivos que ya están almacenados para el paso.
  • Iterar sobre los archivos enviados actualmente.
  • Si un archivo enviado es Ninguno, ignórelo; de lo contrario, sobrescriba el valor ya almacenado.

Aquí está el código:

from django.contrib.formtools.wizard.views import NamedUrlSessionWizardView 

class MyWizardView(NamedUrlSessionWizardView): 

    def get_form(self, step=None, data=None, files=None): 
     if step: 
      step_files = self.storage.get_step_files(step) 
     else: 
      step_files = self.storage.current_step_files 

     if step_files and files: 
      for key, value in step_files.items(): 
       if files.has_key(key) and files[key] is not None: 
        step_files[key] = files[key] 
     elif files: 
      step_files = files 

     return super(MyWizardView, self).get_form(step, data, step_files) 
Cuestiones relacionadas