使用 Ajax 按钮过滤 Django 模型
Posted
技术标签:
【中文标题】使用 Ajax 按钮过滤 Django 模型【英文标题】:Using Ajax Button to Filter Django Models 【发布时间】:2017-03-26 04:26:35 【问题描述】:我正在尝试在我的网站上制作按钮,当单击这些按钮时,会将特定过滤器应用于我的模型数据库。我要排序的模型项目是“Clothes_Item”,我想应用各种过滤器。我只是想让它在一个非常基本的层面上工作,然后我就可以从那里弄清楚,所以假设我想要一个单一的按钮来显示所有性别 =“unisex”的服装项目(其中性别是我的 Clothes_Item 模型的一个字段)。
index.html
<input class="filter-button" type="button" data="unisex" value="unisex" data_url/>
main.js
$('.filter-button').on('click', function(event)
event.preventDefault();
var element = $(this); //button that was clicked
$.ajax(
url : 'filter_clothes/',
type: 'GET',
data: filter_category : element.attr("data") ,
);
urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'filter_clothes/', views.filter_clothes, name='filter_clothes'),
#more urls...
views.py
def filter_clothes(request):
filter_category = request.GET.get("filter_category")
clothes = Clothes_Item.objects.filter(gender=filter_category)
return HttpResponseRedirect(reverse('index', kwargs='clothes': clothes))
def index(request, **kwargs):
clothes = Clothes_Item.objects.all()
if 'clothes' in kwargs:
clothes = kwargs['clohtes']
if request.user.is_authenticated():
favorite_clothes_ids = get_favorite_clothes_ids(request)
return render(request, 'index.html', 'clothes': clothes, 'favorite_clothes_ids': favorite_clothes_ids)
return render(request, 'index.html', 'clothes': clothes)
我收到“NoReverseMatch at /filter_clothes/”错误,我有一段时间无法解决此问题。任何帮助将不胜感激!
编辑:上述问题已解决,但我没有完全解决问题。新的错误如下: 没有找到带有参数 '()' 和关键字参数 ''clothes': ]>' 的 'index' 的反向。尝试了 1 种模式:['$']
【问题讨论】:
【参考方案1】:将url : 'filter_clothes/'
更改为url : '/filter_clothes/'
【讨论】:
它仍然给我一个错误:Reverse for 'index' with arguments '()' and keyword arguments ''clothes':您需要在 urls.py 中更改索引视图的正则表达式模式,因为它只匹配空字符串,但您将 clothes
参数传递给它。例如,如果clothes
由字母数字字符组成,您可以将模式更改为r'^/(?P<clothes>\w+)/$'
编辑: 代替 filter_clothes 视图,您可以将获取参数直接传递给索引视图。所以它可能看起来像这样:
def index(request):
clothes = Clothes_Item.objects.all()
filter_category = request.GET.get('filter_category')
if filter_category:
clothes = clothes.filter(gender=filter_category)
if request.user.is_authenticated():
favorite_clothes_ids = get_favorite_clothes_ids(request)
return render(request, 'index.html', 'clothes': clothes, 'favorite_clothes_ids': favorite_clothes_ids)
return render(request, 'index.html', 'clothes': clothes)
【讨论】:
clothes 是 Clothes_Item 对象的查询集,因此特定解决方案在这种情况下不起作用。 您是否尝试在 url 标签中传递查询集,例如`% url 'appname:index' 查询集 %? 不,我正在使用 ajax 向视图函数发送数据。 出错的原因是filter_clothes
视图中的reverse
函数。您只能将字符串或整数作为参数传递给视图,因为参数是 url 的一部分。我已经为答案添加了建议的解决方案。
我的意思是可能的解决方案。以上是关于使用 Ajax 按钮过滤 Django 模型的主要内容,如果未能解决你的问题,请参考以下文章