我正在尝试按用户指定的价格(最低和最高价格)过滤我的产品列表。我有两个输入框用于获取价格范围。“price”是我数据库表中的一列。我收到错误因为int()参数必须是字符串或数字,而不是'dict'。我已经包含了我的模板文件和视图文件的一小部分。
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 :(得分:2)
也许这一行错误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']))
答案 1 :(得分: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" >