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

Django wyszukanie kilku kategorii na raz

Object Storage Arubacloud
0 głosów
147 wizyt
pytanie zadane 17 sierpnia 2020 w Python przez chucksqll Stary wyjadacz (12,930 p.)
edycja 17 sierpnia 2020 przez chucksqll

Cześć, mam sobie prostą aplikację, która wypisuje rekordy z bazy danych w tabelce. Jeśli zaznaczę kategorię jedną przy użyciu

widget: form.Select

wszystko działa jak należy, chciałem dodać możliwość wyszukania naraz różnych kategorii rowerów czyli, jeśli zaznaczę BMX i damka to w tabelce będą pokazane te rowery, które mają kategorię BMX lub damka. W tym celu zamieniłem

widget: form.Select

na

widget: form.CheckboxSelectMultiple

jeśli teraz  wybiorę jakaś jedną opcję lub kilka to niestety wyskakuje taki error:

Select a valid choice. That choice is not one of the available choices.

Jak mam zrobić aby działało tak jak opisałem powyżej?

Poniżej wycinki kodu


class RowerWyszukiwanieForma(forms.ModelForm):
    class Meta:
        model = Rower
        fields = ('kategoria', )
        widgets = {
        	# 'kategoria' : forms.CheckboxSelectMultiple nie  działa
              'kategoria' : forms.Select #działa dobrze
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for i in self.fields:
            self.fields[i].required = False
class Kategoria(models.Model):
    nazwa = models.CharField(max_length=50, unique=True)

class Rower(models.Model):
    kategoria= models.ForeignKey(Kategoria, models.PROTECT, null=True, blank=True)

if kategoria:
    obiekt= obiekt.filter(kategoria__in=[kategoria])

 

komentarz 17 sierpnia 2020 przez adrian17 Ekspert (344,860 p.)
Z głowy odpowiedź na pytanie nie mam, ale na boku z ciekawości... dlaczego zamieniłeś Select na CheckboxSelectMultiple, a nie na SelectMultiple?
komentarz 17 sierpnia 2020 przez chucksqll Stary wyjadacz (12,930 p.)
W sumie to miałem przez chwilę SelectMultiple, a przez drugą chwilę CheckboxSelectMultiple, zostałem przy Checkbox'ie bo przy wyborze kilku opcji ładniej się prezentował według mnie
komentarz 18 sierpnia 2020 przez Nelson89 Dyskutant (7,720 p.)
Przy SelectMultiple też błąd wywalało?

pozdrawiam,

Nelson

1 odpowiedź

+1 głos
odpowiedź 17 sierpnia 2020 przez Nelson89 Dyskutant (7,720 p.)

Cześć,

próbowałem Twój kod uruchomić u siebie i pojawił mi się pewien błąd:

TypeError: RowerWyszukiwanieForma.Meta.fields cannot be a string. Did you mean to type: ('kategoria',)?

Po postąpieniu zgodnie z sugestią zawartą w komunikacie błędu, udało mi się uruchomić ten kod. I to by się zgadzało, bo w dokumentacji Django jest opisane, że atrybut klasy fields, jest opcjonalnym argumentem typu lista z nazwami pól modelu.

Także proponuje zmienić fragment kodu, tam gdzie jest zmienna fields na krotkę :

fields = ('kategoria', )

lub listę:

fields = ['kategoria']

W przykładach zastosowania klasy ModelForm na stronie Django zmienna fields jest listą.

- jaką wersje pythona używasz?

- jaką wersje Django używasz?

- czy ten komunikat pojawia Ci się w terminalu czy na stronie błędu zwracanej przez serwer?

- nazwy kategorii które są wyświetlane są zgodne z tym co jest w bazie danych?

Pozdrawiam,

Nelson

komentarz 17 sierpnia 2020 przez chucksqll Stary wyjadacz (12,930 p.)
edycja 17 sierpnia 2020 przez chucksqll
Moja wina, przeklejając kod, użyłem złej wersji. W tej poprawnej mam listę, bo w sumie jest tam więcej niż jedna wartość. Jedynym problemem jest to co opisałem powyżej, że przy użyciu zwykłego Selecta wszystko działa jak należy, a przy zaznaczeniu jakichkolwiek opcji w MultiSelect'ie nie działa i daje error przy polu wpisywania.

Ogólnie wydaje mi się, że problemem jest połączenie pomiędzy wybranymi kilkoma wartościami, a poprawnym przesłaniem ich, bo jak na sztywno wpisywałem wartości do wyszukania to wszystko było git, ale gdy używam tego MultiSelect'a, żeby je przesłać to coś nie działa tak jakbym chciał, z tego co czytałem na stackoverflow to w większości problemem było zła relacja i zamiast ForeignKey miało być ManyToManyField czy coś w ten deseń, ale w tym przypadku nie wydaje mi się to problemem, bo jak mówiłem na sztywno działa, natomiast w połączeniu już nie.

Python 3.7

Django 3.07

ale to raczej nie problem leży w wersji
komentarz 18 sierpnia 2020 przez Nelson89 Dyskutant (7,720 p.)
O wersje pytałem, bo kiedyś robiłem jakieś ćwiczenie i jedna rzecz mi nie działała, bo autor używał starszej wersji Django, a w nowszej wersji inaczej rozwiązanie wyglądało.

mógłbyś przekleić cały komunikat błędu jaki pojawia się na stornie błędu i w terminalu?

pozdrawiam,

Nelson
komentarz 18 sierpnia 2020 przez Nelson89 Dyskutant (7,720 p.)

Cześć,

Udało Ci się rozwiązać ten problem?

Przed chwilką rozbudowałem "pole testowe" do sprawdzenia czy działa klasa RowerWyszukiwanieForma z widgetem forms.CheckboxSelectMultiple, i cytując klasyka "u mnie działa".

Tak wygląda szablon do testu:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
        <form action="{% url 'bike:zadanie' %}" method="post">
            {% csrf_token %}
            {{ form.as_p }}<br>
            <input type="submit" value="Submit">
        </form>

        {% if rowery %}
        {% for rower in rowery %}
        <table>
            <tr>
                <td>{{ rower.kategoria }}</td>
            </tr>
        </table>
        {% endfor %}
        {% endif %}
</body>
</html>

a tak wygląda widok

def zadanie(request):
    form = RowerWyszukiwanieForma()
    rowery = None

    if request.method == "POST":
        print(request.POST)
        rowery = Rower.objects.all().filter(kategoria__in=request.POST['kategoria'])

    return render(request, 'bike/zadanie.html', {'form': form, 'rowery': rowery})

I w zasadzie filtrowanie działa jak należy.

Mogę spróbować Ci dalej pomóc tylko potrzebowałbym:

  • pełną treść komunikatu z terminalu i ze strony błędu,
  • szerszy widok na Twój kod,

Pozdrawiam,

Nelson

komentarz 24 sierpnia 2020 przez chucksqll Stary wyjadacz (12,930 p.)

Poradziłem sobie ostatecznie ale i tak dzięki za pomoc.

Wprowadziłem nastepujące zmiany:

    kategoria= forms.ModelMultipleChoiceField(
        queryset=Kategoria.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )
            kategoria= form.cleaned_data['kategoria']
            kategoria_lista = []
            for item in kategoria.values_list('id'):
                 kategoria_lista.append(item[0])

            if kategoria:
                queryset = queryset.filter(kategoria__in=kategoria_lista)

 

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
+1 głos
1 odpowiedź 368 wizyt
0 głosów
1 odpowiedź 1,910 wizyt
pytanie zadane 21 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...