Seite 1 von 1

Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Dienstag 17. Dezember 2019, 14:20
von Alex Wagner
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!

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Dienstag 17. Dezember 2019, 14:36
von __deets__
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.

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 00:02
von Alex Wagner
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?

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 01:12
von __deets__
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.

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 07:23
von sparrow
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.

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 08:47
von noisefloor
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

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 09:07
von __blackjack__
@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.

Re: Django: ButtonAction (POSTmethod) ohne HTTPResponse/Request

Verfasst: Mittwoch 18. Dezember 2019, 11:34
von Alex Wagner
@__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!