2016-06-11 5 views
0

Ich versuche, meine Produktliste nach Preis zu filtern, der vom Benutzer spezifiziert wird (minimaler und maximaler Preis) .Ich habe zwei Eingabefeld für das Nehmen der Preisspanne. 'Preis' ist eins der Spalte in meiner Datenbanktabelle. Ich bekomme Störung als int() Argument muss eine Zeichenfolge oder eine Zahl, nicht 'dict'.Ich habe meine Vorlagendatei und kleinen Teil der Sichten-Datei enthalten.Wie Filter Preisspanne für Produkte in Django?

Models.py,

class Add_prod(models.Model): 
    book = models.CharField("Book Name",max_length=40) 
    author = models.CharField("Author",max_length=30) 
    price = models.PositiveIntegerField("Price") 
    image = models.ImageField(upload_to='images',null=True) 
    cat = models.ForeignKey(Add_cat,on_delete=models.PROTECT) 

    def __unicode__(self): 
     return "%s" % (self.cat) 

Meine Template-Datei,

<p>Price</p> 
<input type="text" name="min_price" maxlength="4" size="3" > 
to <input type="text" name="max_price" maxlength="4" size="3"> 
<input type="submit" value="Go"> 

views.py,

@csrf_protect 
def welcome_user(request): 
    if 'min_price' in request.GET: 
     filter_price1 = request.GET.get('min_price') 
     filter_price2 = request.GET.get('max_price') 
     if filter_price1 =='': 
      filter_price1=0 
     if filter_price2=='': 
      filter_price2=Add_prod.objects.all().aggregate(Max('price')) 
     my_products = Add_prod.objects.filter(price__range=(filter_price1,filter_price2)) 
     context = { "products":my_products} 
    return render(request,"welcome-user.html",context) 

ich auch so versucht,

my_products = Add_prod.objects.raw('SELECT * FROM books_add_prod where price between filter_price1 and filter_price2') 
+0

'filter_price1 = request.GET.get ('MIN_PRICE')' 'Druck filter_price1 ' –

+0

Sein korrektes Drucken im Unicode-Nummernformat – Bhanukiran

Antwort

1

Vielleicht gibt diese Zeile falsch filter_price2=Add_prod.objects.all().aggregate(Max('price')) Ursache aggragate ein dict

Sehen Sie diese Dokumente Aggragation

Versuchen Sie folgendes: my_products=Add_prod.objects.filter(price__range(filter_price1,filter_price2['price_max']))

+0

Ich verwendete dictionary.get() -Methode jetzt beide Werte sind vom Typ 'int', aber immer noch Produkte filtern nicht – Bhanukiran

+0

Kann ich Sie models.py sehen? Und würde auch versuchen: 'print (Add_prod.objects.filter (price__range (10,11)))', oder eine andere Zahl, um zu sehen, ob es funktioniert oder nicht. –

+0

Komisch, darf ich deine models.py sehen? –

0

Verwenden Aggregation (cheatsheet) als die maximale price zu bestimmen folgt:

from decimal import Decimal as D 
... 
price1 = D(request.GET.get('min_price', 0)) 
price2 = D(request.GET.get('max_price', 0)) 

if not price2: 
    price2 = Add_prod.objects.aggregate(Max('price'))['price__max'] 

my_products = Add_prod.objects.filter(price__range=(price1, price2)) 

Auf eine andere Anmerkung, warum tun Sie verwenden text Eingänge für price, von denen ich annehme, ist ein DecimalField? Was ist mit einer Nummerneingabe (oder ein django form), um sicher zu stellen, dass die Modelle in Ihrer Ansicht nicht erhöhen Fehler:

<input type="number" name="min_price" min="0" step="0.01" > 
+0

Ich habe sie explizit so konvertiert, filter_price1 = int (filter_price1) aber immer noch nicht alle Produkte angezeigt – Bhanukiran