• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy da się wywołać funkcje z views?

0 głosów
354 wizyt
pytanie zadane 5 października 2020 w Python przez Dzango111 Użytkownik (670 p.)

Czy mogę zrobić coś takiego:

widok

def bazarek(request):
    x_nas = Roslina.objects.get(id=3)
    monety = (kod sqla)
    #widok

    def odejmij():
        monety - x_nas.wartosc
        return monety.save()
        #funkcja, którą chce wywołać

templatka html

{{ odejmij }}

Dodam, że chciałbym do kodu przenieść np takie komendy, które w shellu działają:

#>>> obj = Gracz.objects.get(id=25)
#>>> obj.saldo += 100
#>>> obj.save()

 

komentarz 5 października 2020 przez adrian17 Mentor (354,800 p.)
Niezbyt rozumiem co chcesz zrobić... chcesz, żeby odejmij() się wykonywało podczas generowania template'u? Ale po co, jak możesz to po prostu w kodzie widoku zrobić?
komentarz 5 października 2020 przez Dzango111 Użytkownik (670 p.)

W template jest button, który po wciśnięciu ma wywołać {{odejmij}}

$(document).on("click", ".popover .kup" , function(){
                {{odejmij}}
                alert("Kupiłeś roślinę")
                $(this).parents(".popover").popover('hide');
 });

 

komentarz 5 października 2020 przez adrian17 Mentor (354,800 p.)
...nie, to tak nie działa. Nie możesz po prostu wrzucić funkcji Pythona w środek JSa.

Backend i frontend to niezależne światy. Przeglądarka musi poinformować serwer, że ma coś zrobić. Poczytaj np o AJAXie.

(Poza tym, zazwyczaj ogólnie nie umieszcza się żadnego JSa w template'ach)
komentarz 8 października 2020 przez Dzango111 Użytkownik (670 p.)
Z AJAXa trochę korzystałem, ale prawdę mówiąc, nie bardzo rozumiem po co miałbym go używać w tym przypadku. Wciśnięty button rzeczywiście nie reaguje na {{odejmij}} i choć przyjmuję do wiadomości, że jest to po prostu źle zrobione, to nie rozumiem dlaczego. Wcześniej wydawało mi się, że to przez złe wywoływanie funkcji z widoku.
komentarz 8 października 2020 przez adrian17 Mentor (354,800 p.)

nie bardzo rozumiem po co miałbym go używać w tym przypadku

Napisałeś w Pythonie funkcję odejmij(). Ta funkcja siedzi po stronie serwera. Guzik jest po stronie przeglądarki.

Więc serwer musi skądś wiedzieć, że guzik w przeglądarce został wciśnięty.

Więc przeglądarka musi wysłać tą informację do serwera zapytaniem HTTP - stąd AJAX.

komentarz 10 października 2020 przez Dzango111 Użytkownik (670 p.)
Już chyba rozumiem. Czy dobrym pomysłem byłoby wykorzystać w tym przypadku Django REST? Jeszcze nie miałem z nim styczności, ale chyba do takich zastosowań się nadaje.
komentarz 10 października 2020 przez adrian17 Mentor (354,800 p.)

Django REST Framework jest całkiem popularny do budowania większych API restowych, ale... to zdecydowanie armata na wróble, jeśli piszesz zwykły endpoint na cele AJAXa. Osobiście w ogóle go nie używałem, jeśli nie pisałem dedykowanego API dla klientów zewnętrznych.

1 odpowiedź

0 głosów
odpowiedź 5 października 2020 przez Ehlert Ekspert (215,070 p.)
Najlepiej jest pozamykać poszczególne funkcjonalności w funkcjach/serwisach. Przy czym dobrze aby ich definicje były w oddzielnych plikach. Wtedy w widoku robisz import i normalne wywołanie.

Podobne pytania

0 głosów
1 odpowiedź 958 wizyt
pytanie zadane 12 sierpnia 2018 w C i C++ przez Slegnawierzchowcu Użytkownik (860 p.)
0 głosów
2 odpowiedzi 2,043 wizyt
pytanie zadane 23 marca 2018 w Python przez aleksandraa Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 516 wizyt

93,604 zapytań

142,526 odpowiedzi

322,991 komentarzy

63,088 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...