Wpis z mikrobloga

Robię sobie proste filtrowanie gier w tabeli. Na stronie mam trzy pola: minrating, maxrating i genre (+ przycisk "submit"). Jeżeli wypełnię wszystkie 3, to filtrowanie działa i url wygląda np. tak:

[http://127.0.0.1:5000/test?rating_min=25&rating_max=60&genre=RPG](http://127.0.0.1:5000/test?rating_min=25&rating_max=60&genre=RPG)
Natomiast jeżeli ominę chociaż jedno pole (np. minrating), to wtedy nie wyszukuje mi się nic, mimo, że pozostałe kryteria mają swoje wartości:

[http://127.0.0.1:5000/test?rating_min=&rating_max=60&genre=RPG](http://127.0.0.1:5000/test?rating_min=&rating_max=60&genre=RPG)
Ma ktoś pomysł jak to naprawić? Tzn. żeby w przypadku braku wartości w jakimś polu takie zapytanie się nie wysyłało do url? Próbowałem zmieniać request.args, ale okazuje się, że jest to
immutable dict.

Ewentualnie żeby jakoś ustawić domyślne ukryte wartości (min
rating = 0, max_rating = 100), ale to też chyba nie jest takie łatwe.

HTML

Min Rating:

Max Rating:

Genre:

#naukaprogramowania #python #flask #sqlite #sqlalchemy #html
Pobierz Rajtuz - Robię sobie proste filtrowanie gier w tabeli. Na stronie mam trzy pola: minr...
źródło: comment_1652977721XkewtbClsIb0naqeCmsFk7.jpg
  • 16
@Rajtuz: zazwyczaj obiekty które implementują interfejs słownika (w których pobierasz wartość po kluczu) mają coś takiego, że zamiast:

value = dict["key"]
można zrobić:

value = dict.get("key", "default_value_if_the_key_does_not_exist")
@Henryhenry: W sensie tak jak niżej? Bo nie działa.

listofgames = listofgames.filter(GamesDatabase.rating >= request.args.get("ratingmin", 1))
list
ofgames = listofgames.filter(GamesDatabase.rating <= request.args.get("ratingmax", 100))
listofgames = listofgames.filter(GamesDatabase.rating == request.args.get("genre", "RPG"))
@Rajtuz: jedyna sprawa jaka mi przychodzi do głowy to jeśli zamiast None dostajesz pustego stringa lub podobną wartość która trochę zwodniczo wchodzi w miejsce tej wartości

możesz spróbować ratingmin i ratingmax potraktować parsowaniem do inta:

try:
....d = int(request.args.get('rating_min', 100)
except ValueError:
....d = 100

a genre sprawdzić len()em
@Henryhenry: Nie wiem czy to w ogóle zadziała, bo teraz wydrukowałem sobie request.args i to są słowniki w liście. Wynik z terminala, gdy nie wpiszę nic w ratingmin:

ImmutableMultiDict([('rating_min', ''), ('rating_max', '77'), ('genre', 'RPG')])
@Henryhenry: Chodziło mi o to, że nie wiem czy da się przez get() dostać do słownika który jest zamknięty w liście. Będę myślał jak zastosować to co napisałeś. Uwierz, że sam siedzę nad tym od wielu godzin.

I tak dzięki za to że odpisałeś, i poświęciłeś swój czas.
@Rajtuz: wyrzuć całkowicie ify - nie będą już miały żadnego zastosowania. A w temacie gdzie to wstawić:

try:
....DEFAULT_MIN = 100
....wartosc_do_wsadzenia_w_filter = int(request.args.get('rating_min', DEFAULT_MIN)
except ValueError:
....wartosc_do_wsadzenia_w_filter = DEFAULT_MIN
# ...

a w przypadku stringów:

if len(request.args.get('genre', '')):
....pass # użytkownik coś podał