2016-06-11 65 views
0

我想按照用戶指定的價格(最小和最大價格)過濾我的產品列表。我有兩個輸入框來取價格區間。'價格'是我數據庫表中的一列。 int()參數必須是一個字符串或數字,而不是'dict'。我包含了我的模板文件和一小部分視圖文件。如何過濾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) 

我的模板文件,

<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) 

我也試過這樣的,

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」)''打印filter_price1 ' –

+0

它以unicode數字格式正確打印 – Bhanukiran

回答

1

也許這行錯filter_price2=Add_prod.objects.all().aggregate(Max('price')) 原因aggragate會返回一個字典

看到這個文檔Aggragation

試試這個: my_products=Add_prod.objects.filter(price__range(filter_price1,filter_price2['price_max']))

+0

我使用dictionary.get()方法現在兩個值都是'int'類型,但仍然沒有過濾產品 – Bhanukiran

+0

我可以看到models.py嗎? 也可以試試這個:'print(Add_prod.objects.filter(price__range(10,11)))'或其他數字,以查看它是否工作的天氣。 –

+0

奇怪,我可以看到你的models.py? –

0

使用聚合(cheatsheet)如下,以確定最大price

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)) 

在另一張紙條上,爲什麼您使用的text輸入爲price,我認爲它是DecimalField?關於順序號輸入(或django form)什麼,以確保您的視圖中的強制類型轉換不會引發錯誤:

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

我像這樣明確地轉換它們,filter_price1 = int(filter_price1),但仍然沒有使用所有顯示的產品 – Bhanukiran