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

时间:2016-09-12 11:02:44

标签: python django

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

  1. 网页中的表单,我可以在某些参数中上传文件;
  2. 在我选择合适的档案时提交表格;
  3. 使用上传文件中的这些参数进行一些计算;
  4. 使用计算结果重定向到新网页;
  5. 在此新网页中显示结果。
  6. 我使用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

2 个答案:

答案 0 :(得分:1)

问题是您的表单是直接发布到结果视图的。这意味着从不调用索引视图中POST上发生的计算,结果值始终为空。

您的表单应该发布到/index/,或者更好地发布到{% url "index_view" %};并且您的结果视图不应使结果值可选。

答案 1 :(得分:1)

Q1:urls.py仅将网址映射到用于呈现它们的视图。当您向/index/result/提交表单时,Django会尝试查找与该网址匹配的视图,在这种情况下为results_view

Q2:您应该将计算结果的整个逻辑移到index_view,而不是将结果从result_view传递给result_view