Python 当我们提交表格时,发生了什么?
实际上,我只想得到一个非常简单的web应用程序:Python 当我们提交表格时,发生了什么?,python,django,Python,Django,实际上,我只想得到一个非常简单的web应用程序: 网页中的一个表单,我可以上传一些参数内的文件 当我选择合适的文件时提交表格 使用上传文件中的这些参数进行一些计算 将计算结果重定向到新网页 在此新网页中显示结果 我使用Django 1.10 index.html与类似: <form action="/index/result/" method="post" enctype="multipart/form-data"> {% csrf_token %} <inpu
类似:
<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>
<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>
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!')
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'),
]
我的url.py如下所示:
<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>
<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>
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!')
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'),
]
从django.conf.url导入url,包括
从django.contrib导入管理
admin.autodiscover()
URL模式=[
url(r“^index/$”,索引视图),
url(r'^index/result/?(?P.*)/$,结果视图,名称='result\u视图'),
]
以下是让我非常困惑的地方:
Q1:在index.html和url(r'^index/result/?(?p.*)/$,result,name='result'),
中有两个位置提供结果url地址,url.py中以哪一个为主
Q2:如何将数据(即计算结果)从索引视图
传递到结果视图
?
我没有使用当前方法在
result\u view
函数中获得result
。问题是您的表单直接发布到结果视图。这意味着永远不会调用索引视图中POST上发生的计算,并且结果值始终为空
您的表单应该只发布到
/index/
,或者更好地发布到{%url“index_view”%}
;您的结果视图不应使结果值成为可选值。问题在于您的表单直接发布到结果视图。这意味着永远不会调用索引视图中POST上发生的计算,并且结果值始终为空
您的表单应该只发布到
/index/
,或者更好地发布到{%url“index_view”%}
;您的结果视图不应使结果值成为可选值。Q1:url.py仅将URL映射到用于呈现它们的视图。当您向/index/result/
提交表单时,Django将尝试查找与url匹配的视图,在本例中为结果\视图
问题2:您不应该将结果从
索引视图
传递到结果视图
,而应该将计算结果的整个逻辑移动到结果视图
Q1:url.py只将URL映射到用于呈现它们的视图。当您向/index/result/
提交表单时,Django将尝试查找与url匹配的视图,在本例中为结果\视图
问题2:不要将结果从
index\u视图
传递到result\u视图
,而是应该将计算结果的整个逻辑移动到result\u视图
如果我在计算后直接返回“HttpResponse(result)”,我可以在浏览器中看到结果。所以结果不是空的。但是我不能把它传给结果视图。嗨,丹尼尔·罗斯曼,你还在吗?你能再检查一下这个问题吗?我尝试了很多不同的方法,但仍然不起作用;您的表单肯定是直接发布到结果视图。开始时,我没有提交任何数据,request.method
不等于POST
,因此当我们打开http://192.168.1.100:8023/index/
。和render(请求'index.html',{'form':form})
返回。当我提交表格时,数据将转到http://192.168.1.100:8023/index/result
并尝试查找结果\u视图
函数?所以我应该在result\u view
函数中接收这些数据?对不起,我不知道有什么不清楚。你刚才证实了我说的话;您将表单提交到/index/result,因此在index_视图中计算“result”值的代码自然不会运行。如果我在计算后直接返回“HttpResponse(result)”,我可以在浏览器中看到结果。所以结果不是空的。但是我不能把它传给结果视图。嗨,丹尼尔·罗斯曼,你还在吗?你能再检查一下这个问题吗?我尝试了很多不同的方法,但仍然不起作用;您的表单肯定是直接发布到结果视图。开始时,我没有提交任何数据,request.method
不等于POST
,因此当我们打开http://192.168.1.100:8023/index/
。和render(请求'index.html',{'form':form})
返回。当我提交表格时,数据将转到http://192.168.1.100:8023/index/result
并尝试查找结果\u视图
函数?所以我应该在result\u view
函数中接收这些数据?对不起,我不知道有什么不清楚。你刚才证实了我说的话;您将表单提交到/index/result,因此在index_视图中计算“result”值的代码自然不会运行。Q1不太正确,因为OP有一个?在
组之前,这使得它是可选的;“/index/result/”不匹配。如果只使用一个查看功能也可以显示所有结果,但两个网页index
和result
都有相同的url,因此刷新网页时,您必须再次提交。我不想再次提交表单,我想重定向到结果
页面的其他url。@DanielRoseman,谢谢你指出这一点。修正了我的答案。谢谢,你启发了我,通过将计算结果的逻辑移动到结果视图
,我已经解决了这个问题。Q1不太正确,因为OP有一个?在
组之前,这使得它是可选的;“/index/result/”不匹配。如果只使用一个查看功能也可以显示所有结果,但两个网页index
和result
都有相同的url,因此刷新网页时,您必须再次提交。我不想再提交表格了