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

问题描述 投票:0回答:2

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

我目前正在使用:

return HttpResponse(json.dumps(context), content_type="application/json")

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

TypeError:不是JSON可序列化的

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

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

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

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

context['posts'] = posts

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

json django post django-serializer django-1.11
2个回答
1
投票

首先,您应该知道,一旦呈现Django模板,您无法再动态修改其上下文。见template documentation

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

Option 1: Render the template again

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

Option 2: Modify your template dynamically

如果您确定动态修改模板是最好/唯一的选择,那么您可以采用不同的方法来实现这一目标。

其中一个是通过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


0
投票

那么使用JsonResponse而不是HttpResponse呢?你还需要为Post模型定义一个序列化器。

© www.soinside.com 2019 - 2024. All rights reserved.