Eigentlich mag ich nur eine sehr einfache Web-Anwendung bekommen:Wenn wir ein Formular einreichen, was ist passiert?
- ein Formular auf einer Webseite, die ich eine Datei innerhalb einiger Parameter hochladen kann;
- senden Sie das Formular, wenn ich eine richtige Datei auswählen;
- einige Berechnungen mit diesen Parametern in der hochgeladenen Datei durchführen;
- umleiten zu einer neuen Webseite mit dem Berechnungsergebnis;
- 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.
Q1 ist nicht ganz richtig, weil OP hat? vor der '' Gruppe, die es optional macht; "/ index/result /" * stimmt überein *. –
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
@DanielRoseman, vielen Dank, dass Sie darauf hingewiesen haben. Meine Antwort wurde korrigiert. – skoll