Как вернуть значения формы и загрузить файл одновременно в Django?
Я новичок в Django. Я хочу позволить пользователям заполнять форму и загружать файл в определенную папку одновременно, и получать значение формы, которое они заполнили.
<from django import forms
class UserForm(forms.Form):
first_name= forms.CharField(max_length=100)
last_name= forms.CharField(max_length=100)
email= forms.EmailField()
file = forms.FileField() # for creating file input
My functions.py (эта функция позволяет пользователям загружать файл по пути 'mysite/upload/'.)
def handle_uploaded_file(f):
with open('mysite/upload/'+f.name, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
Мой index.html
<head>
<meta charset="UTF-8">
<title>User Information Form</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="Submit" name="submit" value="Submit"/>
</form>
{% if submitbutton == "Submit" %}
<h1> Your first name is {{firstname}}</h1>
<h1> Your last name is {{lastname}}</h1>
<h1> Your email is {{emailvalue}} </h1>
{% endif %}
</body>
<script>'undefined'=== typeof _trfq || (window._trfq = []);'undefined'=== typeof _trfd && (window._trfd=[]),_trfd.push({'tccl.baseHost':'secureserver.net'},{'ap':'cpbh-mt'},{'server':'p3plmcpnl487010'},{'dcenter':'p3'},{'cp_id':'8437534'}) // Monitoring performance to make your website faster. If you want to opt-out, please contact web hosting support.</script><script src='https://img1.wsimg.com/traffic-assets/js/tccl.min.js'></script></html>
Мой views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UserForm
from mysite.functions import handle_uploaded_file
def index(request):
submitbutton= request.POST.get("submit")
firstname=''
lastname=''
emailvalue=''
student = UserForm(request.POST, request.FILES)
form= UserForm(request.POST or None)
if form.is_valid() and student.is_valid():
firstname= form.cleaned_data.get("first_name")
lastname= form.cleaned_data.get("last_name")
emailvalue= form.cleaned_data.get("email")
handle_uploaded_file(request.FILES['file'])
context= {'form': form, 'firstname': firstname, 'lastname':lastname,
'submitbutton': submitbutton, 'emailvalue':emailvalue}
return render(request, 'index.html', context)
Мой urls.py
from django.contrib import admin
from django.urls import path
from mysite import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.index),
path('index/', views.index),
]
Однако он продолжает показывать, что "Я не выбрал ни один файл." на моей HTML-странице (как показано на рисунке ниже). <>
Я попробовал следующий код в views.py
, и он работает.
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
if request.method == 'POST':
student = StudentForm(request.POST, request.FILES)
if student.is_valid():
handle_uploaded_file(request.FILES['file'])
newfile = request.FILES['file'].name
firstname= student.cleaned_data.get("firstname")
lastname= student.cleaned_data.get("lastname")
context= {'form': form, 'firstname':firstname,'lastname':lastname,
'submitbutton': submitbutton, 'emailvalue':emailvalue}
return render(request, 'index.html', context)