实际上,我只想获得一个非常简单的Web应用程序:
我使用Django 1.10。
index.html <form>
,如下所示:
<form action="/index/result/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type=">
<div class="field">
<label for="id_file">Input File:</label>
{{ form.file }} <!--from django model-->
</div>
<p><input type="submit" value="Submit"/></p>
</form>
result.html 显示结果如下:
<div id="out">
<table id="result_display" border="1px" hidden>
<thead>
<tr>
<th>No.</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<!--here will display the value comes from result-->
<th id="r_name"> {{ result }} </th>
</tr>
</tbody>
</table>
</div>
我的 views.py 就像这样:
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt
from forms import UploadFileForm
# Create your views here.
@csrf_exempt
def index_view(request):
para = ''
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
cd = form.cleaned_data
if cd['file']:
para = cd.get('file').read().split('\r\n')
else:
return HttpResponse('Please Input a File!')
else:
return HttpResponse('Form is invalid!')
if para:
# do some calculation with para
result = {"name": "NAD"}
return redirect('result_view', result=result) # to another view 'result_view'
else:
form = UploadFileForm()
return render(request, 'index.html', {'form': form})
def result_view(request, result=''):
if result:
return render(request, 'result.html', {'result': result})
else:
return HttpResponse('no result!')
我的 urls.py 是这样的:
from django.conf.urls import url, include
from django.contrib import admin
admin.autodiscover()
urlpatterns = [
url(r'^index/$', index_view),
url(r'^index/result/?(?P<result>.*)/$', result_view, name='result_view'),
]
以下是我真正困惑的事情:
Q1 :有两个地方在index.html中提供结果网址<form action="/index/result/" method="post" enctype="multipart/form-data">
,在urls.py中提供url(r'^index/result/?(?P<result>.*)/$', result, name='result'),
,哪一个占据主导地位?
Q2 :如何将数据(即计算结果)从index_view
传递到result_view
?
我没有使用当前方法在result
函数中获得result_view
。
答案 0 :(得分:1)
问题是您的表单是直接发布到结果视图的。这意味着从不调用索引视图中POST上发生的计算,结果值始终为空。
您的表单应该发布到/index/
,或者更好地发布到{% url "index_view" %}
;并且您的结果视图不应使结果值可选。
答案 1 :(得分:1)
Q1:urls.py仅将网址映射到用于呈现它们的视图。当您向/index/result/
提交表单时,Django会尝试查找与该网址匹配的视图,在这种情况下为results_view
。
Q2:您应该将计算结果的整个逻辑移到index_view
,而不是将结果从result_view
传递给result_view
。