Учитывая модель с требуемым полем называется 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)
Вот как это выглядит:
Однако, если форма не действительна (см первый еще случай), я не могу 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>
Если поле сам файл не является проверка, вы можете извлекать правильно проверенные данные из словаря form.cleaned_data'. Вам не нужно создавать (несохраненный) экземпляр. –