2015-12-16 3 views
3

Учитывая модель с требуемым полем называется number и ClearableFileInput FileField называется upload_file:Сохраняя загруженный файл (FileField), когда форма не является действительным

class ExampleModel(models.Model): 
    number = models.IntegerField() 
    upload_file = models.FileField(blank=True, null=True) 

На мой взгляд, на POST, если форма is_valid я может заполнить clearable часть FileField при возврате на ту же страницу.

def example_view(request): 
    context = RequestContext(request) 
    if request.method == 'POST': 
     form = ExampleForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form_instance = form.save() 
      form = ExampleForm(instance=form_instance) 
      # or alternatively, for just the upload file field 
      form = ExampleForm(initial={'upload_file': form_instance.upload_file}) 
     else: 
      form_instance = form.save(commit=False) 
      form = ExampleForm(initial={'upload_file': form_instance.upload_file}) 
      # unfortunately, this also does not work: 
      form = ExampleForm(initial={'upload_file': form.fields['upload_file']}) 
    else: 
     form = ExampleForm() 
return render_to_response('enterrecords/example.html', {'form': form}, context) 

Вот как это выглядит:

Django ClearableFileInput

Однако, если форма не действительна (см первый еще случай), я не могу form.save(commit=False) и, следовательно, не может заполнить Устраняемые часть от FileField.

form.save(commit=False) дает следующее сообщение об ошибке:

ValueError at /en/myapp/example/ 
The ExampleModel could not be created because the data didn't validate. 

Есть обходной путь для этой проблемы?

Для полноты ...

ModelForm

class ExampleForm(forms.ModelForm): 
    class Meta: 
     model = ExampleModel 

Шаблон

<form enctype="multipart/form-data" method="POST" action="{% url 'eg' %}"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" name="next" value="Next" />Next</button> 
</form> 
+0

Если поле сам файл не является проверка, вы можете извлекать правильно проверенные данные из словаря form.cleaned_data'. Вам не нужно создавать (несохраненный) экземпляр. –

ответ

0

Используйте form.clean_xxx с xxx является полем для очистки в вашем form. Он называется до с вызовом is_valid() вашего вида.

Вот пример того, что я делаю, когда получаю файл Excel в своей форме (мой класс UploadedFileHandler здесь бесполезен, это просто показать вам принцип).

Идея заключается в том, что, даже если форма не является допустимым, файл Excel является всегда сохраняется, и, таким образом, я держать след того, что произошло:

def clean_excel_file(self): 
    uploaded_file = self.files.get('excel_file') 
    if uploaded_file: 
     try: 
      nom = UploadedFileHandler.generate_filename(
       splitext(basename(uploaded_file.name))[1]) 
      dst = UploadedFileHandler.get_url(nom, 'imports/excel/') 

      # sauver le fichier 
      dst_full = UploadedFileHandler.full_filename(dst) 
      UploadedFileHandler.make_dir(dst_full) 
      UploadedFileHandler.save(uploaded_file, dst_full) 

      retour = ExcelFile.objects.create(
       # description = nom de fichier sans l'extension : 
       description=path.splitext(basename(str(uploaded_file)))[0], 
       fichier_origine=uploaded_file, 
       excel_file=dst) 
      retour.save() 
      return retour 
     except IOError: 
      self.errors['excel_file'] = ErrorList([_("Unknown file type")]) 
    return None 
Смежные вопросы