Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Django, Flask, Bottle, WSGI, CGI…
Antworten
Alex Wagner
User
Beiträge: 3
Registriert: Dienstag 17. Dezember 2019, 14:06

Hallo zusammen,

ich bin gerade dabei auf meiner erstellten Website einen Button einzufügen, welcher nach der Betätigung eine Funktion aufruft.
Um es einfach zu halten, wird der Button betätigt dann wird eine print("Hello World") aufgerufen.

Das gelingt mir momentan so, dass ich durch eine ButtonAction eine Funktion in der views.py aufrufe.
Mein Problem hierbei ist, dass diese aufgerufene Funktion per Rückgabewert zwingend einen HttpResponse erwartet:

def choose(request):
print("success")

return render(request, 'trainstationcontrol_detail.html')


Ich möchte allerdings keine Werte auf der Website refreshen und somit brauche ich auch diesen HttpResponse nicht.
Lasse ich diesen allerdings weg, dann bekomme ich folgende Fehlermeldung:

The view a_TrainstationControl.views.choose didn't return an HttpResponse object. It returned None instead.

Gibt es eine Möglichkeit durch eine ButtonAction (Postmethod) eine Python Funktion aufzurufen, somit dass ich keinen HttpResponse benötige?


Vielen Dank!
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst immer eine HTTP-Response haben. So funktioniert HTTP nunmal. Wenn dein Button kein neuladen einer Seite ausloesen soll, musst du auf Javascript und AJAX zurueckgreifen, oder gar auf einen Websocket. Damit kannst du das response dann ignorieren.
Alex Wagner
User
Beiträge: 3
Registriert: Dienstag 17. Dezember 2019, 14:06

Hallo,

vielen Dank für die schnelle Antwort!
Ich habe es jetzt mit Javascript und AJAX gelöst. Das scheint so zu funktionieren.

Jetzt habe ich nur noch das unschöne Problem, dass wenn ich den Button betätige die Website ganz nach oben (Seitenanfang) springt.
Kann man dieses Phänomen noch irgendwie abstellen?
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin kein Experte. Vermute aber mal du musst in JS das Event konsumieren. Statt zu propagieren. Wie genau hängt vom konkreten HTML und Code ab.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich bin ebenfalls kein Experte fürJavascript, aber ist der Clou an Ajax nicht gerade, dass man die Seite nicht neu lädt, sondern die Werte auf der Seite updated?

"Scrollt nach oben" klingt, als würde die Seite neu geladen werden. Dafür braucht man ja kein Ajax, da kann man ja auch einfach die Seite neu ausliefern.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zeig' doch mal den relevanten Code, also die Django Funktion bzw. Klasse, die via JavaScript aufgerufen wird und den JS-Code deiner Seite.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sparrow: Nein, das scrollt nach oben klingt bei Ajax *nicht* nach neu geladen, sondern das der Link als Ziel "#" hat, weil man ein `href` angeben muss und es eben nicht unterbunden wird, dass dieses Ziel angesprungen wird. Zum Beispiel durch ein `event.preventDefault()` in der Funktion die das Ereignis behandelt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Alex Wagner
User
Beiträge: 3
Registriert: Dienstag 17. Dezember 2019, 14:06

@__blackjack__
Genau du hattest recht.

Ich hatte als Button einen Link verwendet:
<a class="testbutton btn btn-primary btn-lg" id="like1" href="#" data-catid="1">Like</a>

Ich habe diese Zeile jetzt durch diese ersetzt:
<button type="button" class="testbutton btn-primary" id="like1" data-catid="1">Like</button>


Und nun habe ich auch dieses Problem gelöst und die Seite bleibt an Ort und Stelle!
Vielen Dank!
Antworten