【发布时间】:2015-06-20 17:21:20
【问题描述】:
所以基本上我在 Django 中有一个网站,它是一个店面,最终用户可以使用三个过滤器。产品类型过滤器(裤子、鞋子、衬衫等)、配送过滤器(是/否)和位置/人气过滤器。
目前在我的views.py中我有这个方法。
if request.is_ajax():
if request.GET.get('filter') == 'shirts':
latest_entries = Entry.objects.filter(entrytype="shirts")
context = {'latest_entries': latest_entries}
return render(request, 'storefrontload.html', context)
if request.GET.get('filter') == 'pants':
latest_entries = Entry.objects.filter(entrytype="pants")
context = {'latest_entries': latest_entries}
return render(request, 'storefrontload.html', context)
if request.GET.get('filter') == 'shoes':
latest_entries = Entry.objects.filter(entrytype="shoes")
context = {'latest_entries': latest_entries}
return render(request, 'storefrontload.html', context)
如您所见,它处理第一个过滤器。我遇到的问题是,如果我选择,比如说“裤子”,它会按裤子过滤,但忽略在其他两个过滤器中选择的内容。另一个例子,假设我选择了裤子,页面会填充该过滤器的结果。但是,如果我随后转到交付过滤器并选择“是”,页面将填充仅可交付的项目,但忘记了“裤子”过滤器。
我想知道如何在我的视图中创建一个查询集,以记住其他两个查询集(如果这有意义的话)。
我能想到的唯一方法是为每个过滤器中的每个值创建真/假标志,然后添加大约 100 行 if/then 语句检查每个标志。一定有更好的方法。
更新:
这就是我从模板中传递过滤器值的方式。
function filter(type) {
$.get("/storefront/?filter="+type, function(data) {
var $data = data;
$('.grid').children().remove();
$('.grid').append( $data ).masonry( 'appended', $data, true ).masonry( 'layout' );
});
}
//Product Filter
$("#shirts").unbind().click(function () {
filter("shirts");
return false;
});
$("#pants").unbind().click(function () {
filter("pants");
return false;
});
$("#shoes").unbind().click(function () {
filter("shoes");
return false;
});
//Delivery Filter
$("#deliveryyes").unbind().click(function () {
filter("deliveryyes");
return false;
});
$("#deliveryno").unbind().click(function () {
filter("deliveryno");
return false;
});
在我的views.py中,这不起作用:
entry_types = request.GET.getlist('filter')
latest_entries = Entry.objects.filter(entrytype__in=entry_types)
因为我需要按 entrytype('pants', 'shirts', shoes') 和 deliveryoption ('deliveryyes', 'deliveryno') 进行过滤。每个过滤器在我的模型中都有自己的列。
models.py
class Entry(models.Model):
headline= models.CharField(max_length=200,)
body_text = models.TextField()
author=models.ForeignKey(settings.AUTH_USER_MODEL, related_name='entryauthors')
pub_date=models.DateTimeField(auto_now_add=True)
zipcode =models.IntegerField(null=True, max_length=10)
!!! entrytype = models.CharField(null=True, max_length=10)
!!! deliveryoption=models.CharField(null=True, max_length=5)
【问题讨论】:
标签: django django-views