2012-05-15 9 views
5

My FormWizard (Django 1.4) pozwala użytkownikowi przechodzić do przodu i do tyłu, aż do zakończenia pracy kreatora. Kreator zachowuje wszystkie wartości wypełnione przez użytkownika i wyświetla je na wypadek, gdyby użytkownik powrócił do kroku, który już ukończył.FormWizard i FileFields (Django 1.4)

Działa to dobrze, np. Dla CharField, ale nie działa dla FileFields. W przypadku, gdy użytkownik przesyła plik w kroku zawierającym FileField, a później wraca do tego kroku, musi ponownie przesłać plik.

Czy istnieje sposób, aby użytkownik nie musiał ponownie przesyłać pliku?

Należy pamiętać, że dane formularza nie zostały jeszcze zapisane w bazie danych.

Odpowiedz

2

Niedawno natrafiłem na ten sam problem i mogłem go rozwiązać przez podklasowanie SessionWizardView Django (w moim przypadku NamedUrlSessionWizardView) i przesłonięcie metody get_form.

Basicly I wykonaj następujące czynności:

  • Pobierz pliki, które są już zapisane w kroku.
  • Powtórzyć bieżące przesłane pliki.
  • Jeśli przesłany plik ma wartość None, zignoruj ​​go, w przeciwnym razie nadpisz już zapisaną wartość.

Oto kod:

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) 
Powiązane problemy