Python 当我们提交表格时,发生了什么?

Python 当我们提交表格时,发生了什么?,python,django,Python,Django,实际上,我只想得到一个非常简单的web应用程序: 网页中的一个表单,我可以上传一些参数内的文件 当我选择合适的文件时提交表格 使用上传文件中的这些参数进行一些计算 将计算结果重定向到新网页 在此新网页中显示结果 我使用Django 1.10 index.html与类似: <form action="/index/result/" method="post" enctype="multipart/form-data"> {% csrf_token %} <inpu

实际上,我只想得到一个非常简单的web应用程序:

  • 网页中的一个表单,我可以上传一些参数内的文件
  • 当我选择合适的文件时提交表格
  • 使用上传文件中的这些参数进行一些计算
  • 将计算结果重定向到新网页
  • 在此新网页中显示结果
  • 我使用Django 1.10

    index.html
    类似:

    <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,因此刷新网页时,您必须再次提交。我不想再提交表格了