我正在制作一个购买汽车的网站,其中有一个发送的表格(过滤器)POST。
该模型Ads包含具有以下字段的对象:brand_id, model_id, generation_id.
问题:如果在网站的过滤器中没有选择“品牌”位置,那么将request.POST['brand']返回以下内容:(''
空字符串,因为<option value="">,所以输出可以更改)。然后就会出现这个错误:ValueError: Field 'id' expected a number but got ''.
但重点不是这个错误,我需要的是如果没有选择任何内容,那么Django 返回所有对象,也就是忽略过滤器brand_id。
注意: 不仅可以取消选择“品牌”,还可以取消选择任何字段。有必要通过选择“品牌”而不是选择“型号”来使过滤器忽略 model_id 并仅按“品牌”进行搜索。等等。还有 10 个字段(例如“品牌”和“型号”)可供搜索。如果针对每个案例都写,那就太多了。
以下是代码views.py:
context = {
'Body': Brand.objects.all(),
'EngineType': EngineType.objects.all(),
'BoostType': BoostType.objects.all(),
}
context['Ads'] = Ads.objects.filter(brand_id=request.POST['brand'],
model_id=request.POST['model'],
generation_id=request.POST['generation'],
)
return render(request, 'ADS/main.html', context)
请帮忙。如果您对如何以完全不同(更好)的方式做到这一点有任何想法,我很乐意听取。
理论上理想的解决方案:Ads.objects.filter(brand_id=request.POST['brand'])可以传递给而不是 的参数request.POST['brand'],比如all(),但all()不能。然后就可以使用里面的函数(测试)if检查每个参数brand_id=test(request.POST['brand'])。如果此参数request.POST['brand']= ''(空字符串),则返回这个非常神奇的参数,它将取消此字段的过滤(在此示例中brand_id:)。
如果此字段在您的表单中是可选的,并且您希望返回所有为
brand空的对象,那么:但为了以防万一,我会写,如果表单字段需要设为必填项,则
<select>必须设置该属性required:更新:
现在已经很清楚了,您需要一个 Q 类。您可以在官方文档中详细了解其工作原理。
逻辑是什么:
因为你写的字段很多,超过10个,所以需要创建一个循环来检查字段是否填充。如果不这样做,将会搜索空字段。例子:
接下来,我们创建一个循环和一个过滤器,并检查字段;如果字段已填充,则我们将其添加到过滤器中:
然后将过滤器插入到请求本身中:
因此,将返回
Ads根据填充字段进行过滤的对象。为了便于理解,
**以下是答案