2016-11-24 4 views
0

Ich erstelle ein kleines Quizspiel mit Bottle und habe einige Probleme. Die Seite wird geladen, eine zufällige Trivia-Frage wird aus der Datenbank abgerufen und im Browser angezeigt. Der Server versucht automatisch, den Wert aus der Formulareingabe abzurufen, wenn die Seite geladen wird und die Eingabe leer ist (keine Überraschung). Aber wenn ich versuche, die Antwort auf die Quizfrage in das Eingabefeld einzugeben und auf die Schaltfläche "Senden" zu klicken, wird die Seite neu geladen und es wird die nächste Quizfrage aus der Datenbank angezeigt. Meine Benutzereingabe stimmt nie mit der aktuellen Quizfrage überein, da sie immer den Wert der vorherigen Frage enthält.Benutzereingaben auswerten, bevor eine neue Datenbankabfrage durchgeführt wird

Wie bekomme ich den Wert aus der Benutzereingabe für diese bestimmte Datenbankabfrage, ohne dass die Seite beim Senden neu geladen wird und eine neue zufällige Abfrage generiert wird?

In meiner game.py Datei:

@app.route("/game", method=["POST"]) 
def game(db): 
    db.execute("select * from questions order by rand() limit 1") 
    data = db.fetchall() 
    guess = "" 
    name = "" 
    for d in data: 
     country_name = d["name"] 

    if request.POST.the_guess: 
     guess = request.POST.the_guess.strip() 

return bottle.template("temp", data=data) 

Und in meinem temp.tpl:

<form method="POST" action="/game"> <input type="text" name="the_guess"> <input type="submit" value="guess"> </form>

+0

Sie sollten die Frage ID in eine versteckte Eingabe in das Formular. Dann erhalten Sie die Schätzung und die ID von 'request.POST', und eine Datenbankabfrage, um zu sehen, ob die Antwort Übereinstimmungen mit dieser ID. – Barmar

+0

Was ich festgestellt habe, ist, wenn ich das Formular abschicke, löscht es alle Werte in meiner Server-Datei. Ich bin nicht, was los ist. –

+0

Sie meinen, es löscht alles aus der Datenbanktabelle? – Barmar

Antwort

1

Ihre Anfrage Ansicht tut das gleiche, ob der Benutzer das Formular sendet, dh

  • Bekommen Sie eine zufällige Frage
  • strip die Antwort, falls vorhanden.

Sie haben jedoch zwei Szenarien

  • Benutzer klickt auf den Link zu „Start“ zu prüfen, um das Spiel zu spielen und so hat gerade gelandet auf der Seite.
  • Der Benutzer hat das Formular abgeschickt und Sie müssen seine reposne

Dazu bewerten Sie die Frage-ID als verstecktes Feld passieren muss, damit Sie wissen, was die Antwort richtig ist.

<form method="POST" action="/game"> 
    <input type="text" name="the_guess"> 
    <input type="submit" value="guess"> 
    <input type="hidden" name="qid" value="YOUR_QUESTION_ID"> 
</form> 

Die Code-Ansicht muss also etwas tun (ich weiß nicht korrekte Semantik einer Flasche Ansicht wissen, so betrachten dies als Pseudo-Code):

@app.route("/game", method=["POST", "GET"]) 
def game(db): 
    # Store if user answered last question correctly or not 
    user_feedback = None 
    # See if this view is beng invoked by user submitting an answer 
    if "submit" in request.POST: 
     guess = request.POST.the_guess.strip() 
     qid = request.POST.qid 
     # Lookup DB for answer of question with ID qid. Store it as answer 
     if guess == answer: 
      user_feedback = True 
     else: 
      user_feedback = False 
    # This part will always execute 
    db.execute("select * from questions order by rand() limit 1") 
    data = db.fetchall() 
    for d in data: 
     country_name = d["name"]   
    return bottle.template("temp", data=data, user_feedback=user_feedback) 

Basierend auf dem Wert der user_feedback In Ihrer Vorlage können Sie eine "Richtig!" oder "Falsch :(" Nachricht.

Verwandte Themen