Kurs Django Podstawa – #5 – Rozszerzenie – Zapis wiadomości do pliku

Posted on: August 7, 2024

Kurs Django Podstawa – #5 – Rozszerzenie – Zapis wiadomości do pliku

Kurs Django Podstawa – #5 – Rozszerzenie – Zapis wiadomości do pliku

“Zapis wiadomości do pliku”

Teraz rozszerzymy funkcjonalność koszyka, tak, żeby można było zmieniać ilość zakupionych produktów i automatycznie patrzeć jak zmienia się cena końcowa, a potem wyślemy taką wiadomość na komputer. Nasz pomysł wygląda następująco.

Na początek zmieńmy plik koszyk.html dodając w formie odnośników “+” i “-” obok wyświetlanej ilości zamówionych produktów 

{% extends 'Sklep/szablon.html' %} {% block wszystko %} <p> Twój koszyk: </p> {% if produkty_koszyk %}   {% for produkt in produkty_koszyk %}       <p>nazwa: {{produkt.nazwa}}, ilość zakupionych sztuk: {{produkt.dodane}} &nbsp;           <a href="/kosz_p/{{produkt.id}}">+</a>&nbsp;           <a href="/kosz_m/{{produkt.id}}">-</a></p>   {% endfor %} {% else %}   <p> Twój koszyk jest pusty jak słoik po ogórkach </p> {% endif %} <br> <p> Całkowita kwota do zapłaty: {{cena}} Złotych </p> {% endblock wszystko %}

kurs-django-robot-5-im1.png

Mamy wyświetlone dwa linki dla każdego produktu w koszyku, które póki co prowadzą do nikąd,

kurs-django-robot-5-im2.png

 aby to zmienić musimy updetować pliki urls.py o dwie dodatkowe linijki, 

path('kosz_p/<id>', kosz_p, name='kosz_p'), path('kosz_m/<id>', kosz_m, name='kosz_m'),

kurs-django-robot-5-im3.png

Chcemy wprowadzić dwie kolejne funkcje, jedna zmniejszająca ilość zakupionych sztuk, a druga zwiększająca, potrzebujemy odwołać się, do konkretnego produktu, dlatego przekażemy wartość ID danego obiektu. 

Teraz przyszedł czas na plik views.py, dodaliśmy jedną linijkę w już istniejącej funkcji koszyk, w celu zaokrąglenia wartości końcowej ceny do dwóch miejsc po przecinku. Oraz dwie funkcję bazujące na funkcji koszyk, ale dodatkowo zmieniające ilość danego produktu o jeden więcej lub mniej.

def koszyk(request):     produkty_koszyk = Produkt.objects.exclude(dodane="0")     cena = 0     for produkt in produkty_koszyk:         cena = cena + float(produkt.cena) * int(produkt.dodane)     cena = float(round(cena, 2))     dane = {'produkty_koszyk': produkty_koszyk, 'cena': cena}     return render(request, 'Sklep/koszyk.html', dane) def kosz_p(request,id):     produkt_wyb = Produkt.objects.get(pk=id)     produkt_p = int(produkt_wyb.dodane) + 1     Produkt.objects.filter(pk=id).update(dodane=produkt_p)     produkty_koszyk = Produkt.objects.exclude(dodane="0")     cena = 0     for produkt in produkty_koszyk:         cena = cena + float(produkt.cena) * int(produkt.dodane)     cena = float(round(cena, 2))     dane = {'produkty_koszyk': produkty_koszyk, 'cena': cena}     return render(request, 'Sklep/koszyk.html', dane) def kosz_m(request,id):     produkt_wyb = Produkt.objects.get(pk=id)     produkt_m = int(produkt_wyb.dodane) - 1     Produkt.objects.filter(pk=id).update(dodane=produkt_m)     produkty_koszyk = Produkt.objects.exclude(dodane="0")     cena = 0     for produkt in produkty_koszyk:         cena = cena + float(produkt.cena) * int(produkt.dodane)     cena = float(round(cena, 2))     dane = {'produkty_koszyk': produkty_koszyk, 'cena': cena}     return render(request, 'Sklep/koszyk.html', dane)

kurs-django-robot-5-im4.png

W nowo dodanych funkcjach na początku pobieramy informacje o danym produkcie z bazy danych wykorzystując wcześniej przesłane ID. Następnie dodajemy jeden lub odejmujemy a reszta pozostaje taka sama jak w funkcji koszyk. Teraz powinno wszystko działać.

kurs-django-robot-5-im5.png

Po wciśnięciu plusa, zwiększy się ilość produktów i cena końcowa o odpowiednią wartość. 

kurs-django-robot-5-im6.png

To jest tylko przykładowe rozwiązanie, jedno z wielu jakie można by było wykorzystać,

dlatego spróbujmy nieco uszczuplić kod, i zastosujmy jedną funkcję, wysyłając dwa parametry, jeden będzie nas informował czy chcemy dodać czy odjąć produkt, a drugi parametr będzie się odnosił tak jak wcześniej do ID produktu.

Najpierw plik koszyk.html

{% extends 'Sklep/szablon.html' %} {% block wszystko %} <p> Twój koszyk: </p> {% if produkty_koszyk %}   {% for produkt in produkty_koszyk %}       <p>nazwa: {{produkt.nazwa}}, ilość zakupionych sztuk: {{produkt.dodane}} &nbsp;           <a href="/kosz/1/{{produkt.id}}">+</a>&nbsp;           <a href="/kosz/0/{{produkt.id}}">-</a>       </p>   {% endfor %} {% else %}   <p> Twój koszyk jest pusty jak słoik po ogórkach </p> {% endif %} <br> <p> Całkowita kwota do zapłaty: {{cena}} Złotych </p> {% endblock wszystko %}

kurs-django-robot-5-im7.png

Uwzględniamy dodatkowy parametr w adresach url, niech 1 będzie oznaczało dodanie a 0 odejmowanie.

Teraz urls.py

Usuwamy dwie linijki z adresami i zamiast niej dajemy jeden adres z dwoma parametrami.

path('kosz_p/<id>', kosz_p, name='kosz_p'), path('kosz_m/<id>', kosz_m, name='kosz_m'), path('kosz/<id1>/<id2>', kosz, name='kosz'),

id1 to nasze 0 albo 1, natomiast id2 to odpowiedni obiekt.

kurs-django-robot-5-im8.png

W pliku views.py usuwamy dwie dodane funckje kosz_p oraz kosz_m i zamiast nich tworzymy funkcję kosz.

def kosz(request,id1,id2):     produkt_wyb = Produkt.objects.get(pk=id2)     if id1 == '1':         produkt_m = int(produkt_wyb.dodane) + 1     else:         produkt_m = int(produkt_wyb.dodane) - 1     Produkt.objects.filter(pk=id2).update(dodane=produkt_m)     produkty_koszyk = Produkt.objects.exclude(dodane="0")     cena = 0     for produkt in produkty_koszyk:         cena = cena + float(produkt.cena) * int(produkt.dodane)     cena = float(round(cena, 2))     dane = {'produkty_koszyk': produkty_koszyk, 'cena': cena}     return render(request, 'Sklep/koszyk.html', dane)

kurs-django-robot-5-im9.png

Teraz w funkcji mamy warunek, jeśli id1 jest równe 1 to dodaj produkt, zwiększ atrybut dodane o 1 danego obiektu, jeśli wartość id1 jest inna, w tym wypadku wynosi 0 to odejmij jeden produkt. Dzięki tej operacji nie zmieniliśmy efektu końcowego, nadal mamy + i - przy ilości produktów, oraz po wciśnięciu ta liczba maleje lub rośnie o jeden wraz z ceną końcową o odpowiednią wartość, ale posiadamy bardziej elegancką postać kodu. To co udało się Tobie zrobić to tak zwana refaktoryzacja kodu, Gratulujemy :D

Następnie zaimplementujemy kolejną funkcjonalność czyli stworzenie pliku tekstowego z podsumowaniem zamówienia na pulpicie, chcieliśmy wplątać w ten kurs wprowadzenie do prostej interakcji z komputerem/laptopem/mikrokomputerem, na którym jest postawiony serwer Django.

Stworzymy przycisk wyślij w naszej aplikacji, który odpali funkcję odpowiedzialną za utworzenie pliku.

W koszyk.html dodajemy jedną linijkę

<a href="/wyslij">Złóż zamówienie</a>
kurs-django-robot-5-im10.png

W urls.py również jedną linijkę

path('wyslij', wyslij, name='wyslij'),
kurs-django-robot-5-im11.png

oraz w views.py nową funckję

def wyslij(request):     produkty = Produkt.objects.all()     produkty_koszyk = Produkt.objects.exclude(dodane="0")     cena = 0       for produkt in produkty_koszyk:         cena = cena + float(produkt.cena) * int(produkt.dodane)     cena = float(round(cena, 2))        file = open(f'C:/Users/Asus/Desktop/zamowienie.txt', "w")     for obiekt in produkty_koszyk:         file.write(f"nazwa: {obiekt.nazwa}, ilość zakupionych sztuk: {produkt.dodane} n")     file.write(f"kwota do zapłaty: {cena}")     file.close()          for produkt in produkty:         Produkt.objects.filter(nazwa=produkt).update(dodane="0")          produkty_koszyk = False     cena = 0         dane = {'produkty_koszyk': produkty_koszyk,'cena': cena}     return render(request, 'Sklep/koszyk.html', dane)

kurs-django-robot-5-im12.png

Szybko, prosto i skutecznie ;D

Funkcja pobiera wszystkie potrzebne obiekty, potem liczy całkowitą kwotę. Można by stworzyć nową klasę w pliku models.py np. Ustawienia i tam przechowywać wartość całkowitej kwoty do zapłaty a potem ją pobierać, możesz nam dać znać czy udało Ci się to zrobić, jakby pojawiły się problemy to po prostu do nas napisz.

file = open(f'C:/Users/Asus/Desktop/zamowienie.txt', "w")

W tej linijce Python spróbuje otworzyć plik zamowienia.txt (a jak taki nie istnieje to go stworzyć), który znajduje się w zdefiniowanej ścieżce, u Ciebie to będzie wyglądać troszkę inaczej,więc jeśli chcesz, żeby plik stworzył się na pulpicie, to prawy na pierwszą lepszą ikonkę na pulpicie, potem właściwości i lokalizacja to szukana ścieżka.

kurs-django-robot-5-im13.png

Następnie w funkcji, mamy pętle, która dla każdego dodanego produktu do koszyka, wypisuje ilość zakupionych sztuk do utworzonego wcześniej pliku, a na końcu zapisuję sumaryczną kwotę za zamówienie. Potem zamyka plik. Skoro zamówienie zostało zrealizowane, chcemy wyczyścić koszyk, co robi dalsza część kodu. Przekazujemy w pakiecie danych pusty koszyk, i cenę równą zero.

kurs-django-robot-5-im14.png

Po kliknięciu Złóż zamówienie wartości w bazie danych się wyzerują, a na pulpicie (w tak zdefiniowanej ścieżce) zostanie utworzony nasz “paragon” czyli plik zamowienie

kurs-django-robot-5-im15.png kurs-django-robot-5-im16.png

Category: Kurs Django Podstawa