使用Django的JSON序列化程序和备用http响应

时间:2018-01-30 18:01:37

标签: json django post django-serializer django-1.11

我尝试在点击事件上创建过滤系统 - 使用AJAX post方法更新模板上显示的上下文。

我目前正在使用:

posts = Post.published.filter(category__name__in=category_filter_items)

使用上下文对象返回响应。但是,这对某些对象类型并不适用:

TypeError:不是JSON可序列化的

我知道有关于序列化工具的事情,但我目前无法使用它们。)正确使用它们或b。)完全使用它们。

对于某些上下文,我使用AJAX post方法将过滤器变量传递给视图 - 然后:

context['posts'] = posts

并将其添加到我的上下文中:

File

有人知道更新上下文的正确方法是这样的吗?

2 个答案:

答案 0 :(得分:1)

首先,您应该知道,一旦呈现Django模板,您就无法动态修改其上下文而无需再次呈现它。请参阅template documentation

在动态修改模板之前,您应该考虑通过调用视图来过滤数据的方法,该视图使用您需要的上下文再次呈现模板。

选项1:再次渲染模板

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))

选项2:动态修改模板

如果您确定动态修改模板是最佳/唯一选择,那么您可以通过不同的方式实现此目标。

其中一个是通过jQuery更改模板,加载由过滤视图呈现的子模板。看看this issue

另一种方法是通过JSON Api获取过滤后的数据,并确保相应地更新模板。例如,您可能希望使用Angular,它使用MVVM architecture pattern

如何在Django中序列化模型?

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模型定义一个序列化器。