좋아, 그래서 먼저 입력 된 type = "파일"값을 설정할 수 없으므로 Narendra의 솔루션을 작동시키기 전에 upvoted 및 구현했습니다. http://www.w3schools.com/jsref/prop_fileupload_value.asp
을하지만, 여기에 작동하는 솔루션입니다 : 참조 형태의
- 별도의 나머지는 업로드 할 필요 파일에서.
- 항상 파일을 저장하거나 파일을 저장해야하는지 확인하기 위해 실행하여 임시 모델에 저장하십시오.
- 임시 모델의 인스턴스 ID를 나타내는 숨김 필드가 있으므로 파일을 변경하면 변경 내용이 적용됩니다. 서버에 저장된 추가 파일을 얻을 수 있지만 외부에서 정리할 수 있습니다.
- 양식을 뺀 파일을 저장할 수 있으면 저장하고 저장된 파일을 원래 모델에 바인딩 한 다음 중간에 업로드 된 파일 모델을 삭제하십시오.
좋아, 여기에 당신이 저자의 (이메일 때로는 유효성을 검사하지 않는 선택) 이메일 주소와 함께 책의 PDF 파일을 저장하려는 일례 나를 위해 작동 절차의 스케치입니다.
models.py
class Book(models.Model):
pdf = models.FileField("PDF", upload_to="books/")
author_email = models.EmailField("Author Email")
class TempPDF(models.Model):
pdf = models.FileField("PDF", upload_to="books/")
forms.py
from project_name.app_name.models import Book, TempPDF
from django.forms import ModelForm
from django.contrib.admin.widgets import AdminFileWidget
class BookForm(ModelForm):
class Meta:
model = Book
exclude = ['pdf',]
class TempPDFForm(ModelForm):
class Meta:
model = TempPDF
widgets = dict(pdf = AdminFileWidget)
# The AdminFileWidget will give a link to the saved file as well as give a prompt to change the file.
# Note: be safe and don't let malicious users upload php/cgi scripts that your webserver may try running.
views.py
def new_book_form(request):
if request.method == 'POST':
## Always try saving file.
try:
temp_pdf_inst = TempPDF.objects.get(id=request.POST.has_key('temp_pdf_id'))
except: ## should really catch specific errors, but being quick
temp_pdf_inst = None
temp_pdf_form = TempPDFForm(request.POST, request.FILES, instance=temp_pdf_inst, prefix='temp_pdf')
if temp_pdf_form.is_valid() and len(request.FILES) > 0:
temp_pdf_inst = temp_pdf_form.save()
temp_pdf_id = temp_pdf_inst.id
book_form = BookForm(request.POST, prefix='book')
if book_form.is_valid(): # All validation rules pass
book = book_form.save(commit=False)
book.pdf = temp_pdf_inst.pdf
book.save()
if temp_pdf_inst != None:
temp_pdf_inst.delete()
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
book_form = BookForm() # An unbound form
temp_pdf_form = TempPDFForm()
temp_pdf_id = None
return render_to_response('bookform_template.html',
dict(book_form = book_form,
temp_pdf_form = temp_pdf_form,
temp_pdf_id = temp_pdf_id)
)
bookform_template.html
<table>
{{ book_form }}
{{ temp_pdf_form }}
<input type="hidden" name="temp_pdf_id" value="{{ temp_pdf_id }}">
</table>
동일한 질문이 있습니다. 모델 필드를 사용하는 경우 유효성 검사가 실패 할 때 파일을 저장해야 유효성 검사가 성공하면 업로드 할 수 있습니까? 그런 다음 업로드 된 파일을 제거하기 위해 가비지 컬렉션을로드해야하지만 사용자가 양식을 성공적으로 완료하지 못했습니다. 나는 장고가 이것을하는 좋은 방법을 가지고 있다고 확신한다! – PhoebeB