2016-09-12 6 views
0

Eigentlich mag ich nur eine sehr einfache Web-Anwendung bekommen:Wenn wir ein Formular einreichen, was ist passiert?

  1. ein Formular auf einer Webseite, die ich eine Datei innerhalb einiger Parameter hochladen kann;
  2. senden Sie das Formular, wenn ich eine richtige Datei auswählen;
  3. einige Berechnungen mit diesen Parametern in der hochgeladenen Datei durchführen;
  4. umleiten zu einer neuen Webseite mit dem Berechnungsergebnis;
  5. das Ergebnis auf dieser neuen Webseite anzeigen.

Ich verwende Django 1.10.

index.html mit <form> wie folgt aus:

<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 für die Anzeige Ergebnis wie folgt aus:

<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> 

mein views.py wie folgt aus:

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!') 

mein urls.py wie folgt aus:

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'), 
] 

Hier sind, was verwirren mich wirklich viel:

Q1: Es gibt zwei Orte Ergebnis URL-Adresse <form action="/index/result/" method="post" enctype="multipart/form-data"> in index.html geben und url(r'^index/result/?(?P<result>.*)/$', result, name='result'), in urls.py, welche wird dominiert?

Q2: Wie Daten zu übergeben (das heißt Berechnungsergebnis) ab index_view zu result_view? Ich habe result in result_view Funktion mit der aktuellen Methode nicht erhalten.

Antwort

1

Q1: urls.py Karten nur die URLs auf die Ansichten verwendet, um sie zu machen. Wenn Sie ein Formular an /index/result/ senden, wird Django versuchen, eine Ansicht zu finden, die der URL entspricht, in diesem Fall results_view.

Q2: Statt das Ergebnis von index_view an result_view zu übergeben, sollten Sie die gesamte Logik der Berechnung des Ergebnisses auf die result_view verschieben.

+1

Q1 ist nicht ganz richtig, weil OP hat? vor der '' Gruppe, die es optional macht; "/ index/result /" * stimmt überein *. –

+0

Wenn Sie nur eine Ansichtsfunktion verwenden, können Sie auch alle Ergebnisse anzeigen, aber beide Webseiten 'index' und' result' haben dieselbe URL. Wenn Sie die Webseite aktualisieren, müssen Sie sie erneut senden. Ich möchte das Formular nicht noch einmal absenden, ich möchte auf eine andere URL für die Seite 'Ergebnis' umleiten. – Belter

+0

@DanielRoseman, vielen Dank, dass Sie darauf hingewiesen haben. Meine Antwort wurde korrigiert. – skoll

1

Das Problem ist, dass das Formular direkt an die Ergebnisansicht entsendet. Das bedeutet, dass die Berechnungen, die bei POST in Ihrer Indexansicht stattfinden, nie aufgerufen werden und der Ergebniswert immer leer ist.

Ihr Formular sollte nur auf oder noch besser auf {% url "index_view" %}; und Ihre Ergebnisansicht sollte den Ergebniswert nicht optional machen.

+0

wenn ich „Httpresponse (Ergebnis)“ direkt nach der Berechnung zurückkehren, kann ich in Browser zur Folge sehen. Das Ergebnis ist nicht leer. Aber ich kann es nicht an result_view weitergeben. – Belter

+0

Hallo, Daniel Roseman, bist du noch da? Können Sie diese Frage noch einmal überprüfen?Ich habe viele verschiedene Möglichkeiten ausprobiert, aber es funktioniert immer noch nicht. – Belter

+0

Ich verstehe nicht, was Sie sagen; Ihr Formular wird definitiv direkt in der Ergebnisansicht veröffentlicht. –

Verwandte Themen