我尝试在点击事件上创建过滤系统 - 使用AJAX post方法更新模板上显示的上下文。
我目前正在使用:
posts = Post.published.filter(category__name__in=category_filter_items)
使用上下文对象返回响应。但是,这对某些对象类型并不适用:
TypeError:不是JSON可序列化的
我知道有关于序列化工具的事情,但我目前无法使用它们。)正确使用它们或b。)完全使用它们。
对于某些上下文,我使用AJAX post方法将过滤器变量传递给视图 - 然后:
context['posts'] = posts
并将其添加到我的上下文中:
File
有人知道更新上下文的正确方法是这样的吗?
答案 0 :(得分:1)
首先,您应该知道,一旦呈现Django模板,您就无法动态修改其上下文而无需再次呈现它。请参阅template documentation。
在动态修改模板之前,您应该考虑通过调用视图来过滤数据的方法,该视图使用您需要的上下文再次呈现模板。
def my_view(request):
posts = Posts.objects.all()
# TODO: Filter the posts against the request
template = loader.get_template('template.html')
context = {
'posts': posts,
}
return HttpResponse(template.render(context, request))
如果您确定动态修改模板是最佳/唯一选择,那么您可以通过不同的方式实现此目标。
其中一个是通过jQuery更改模板,加载由过滤视图呈现的子模板。看看this issue。
另一种方法是通过JSON Api获取过滤后的数据,并确保相应地更新模板。例如,您可能希望使用Angular,它使用MVVM architecture pattern。
Django提供serialization of models作为核心功能。
将模型序列化为JSON非常简单:
from django.core.serializers import serialize
serialize('json', SomeModel.objects.all())
如果您需要实施带有序列化模型和过滤的API,您可能需要使用django-rest-framework。
答案 1 :(得分:0)
如何使用JsonResponse而不是HttpResponse?你还需要为Post模型定义一个序列化器。