在Ajax调用之后使用Django模板呈现JSON对象

发布于 2021-01-29 18:32:49

我一直在尝试了解在Django中执行Ajax的最佳方法是什么。通过四处阅读,我了解到常见的过程是:

  1. 使用一些JavaScript库(例如jQuery)来制定您的Ajax调用,在Django中设置URL模式以捕获该调用并将其传递给视图函数

  2. Python视图函数中,检索您感兴趣的对象并将其以JSON格式或类似格式发送回客户端(通过使用内置的序列化器模块或simplejson

  3. 在JavaScript中定义一个回调函数,该函数接收JSON数据并进行解析,以便创建需要显示的HTML。最后,JavaScript脚本将HTML放置在应保留的位置。

现在,我仍然不明白的是 Django模板如何与所有这些相关?
显然,我们根本没有利用模板的功能。理想情况下,我认为最好传回JSON对象和模板名称,以便可以迭代数据并创建HTML块。但是也许我在这里完全错了…

我发现朝这个方向发展的唯一资源是此代码段(769),但我还没有尝试过。显然,在这种情况下将要发生的所有结果HTML都是在服务器端创建的,然后传递给客户端。JavaScript回调函数只需要在正确的位置显示它。

这会导致性能问题吗?如果没有,即使不使用上面的代码段,为什么不使用Python而不是前端直接在后端格式化HTML?

非常感谢!

更新:请使用
代码片段942,
因为它是上述代码的增强版本!
我发现继承支持通过这种方式效果更好。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    嘿,谢谢vikingosegundo!

    我也喜欢使用装饰器:-)。但是与此同时,我一直在遵循我上面提到的摘录建议的方法。唯一的事情是使用代码段n。942因为它是原始版本的改进版本。运作方式如下:

    假设您有一个包含任意可重复使用的有用块的大小的模板(例如,“ subtemplate.html”):

         ........
        <div id="results">          
            {% block results %}
                {% for el in items %}
                       <li>{{el|capfirst}}</li>
                {% endfor %}
            {% endblock %}      
        </div><br />
         ........
    

    通过在视图文件中导入以上代码段,您可以轻松引用模板中的任何块。一个很酷的功能是考虑了模板之间的继承关系,因此,如果您引用包含另一个块的一个块,依此类推,那么一切都应该可以正常工作。因此,ajax视图如下所示:

    from django.template import loader
    # downloaded from djangosnippets.com[942]
    from my_project.snippets.template import render_block_to_string
    
    def ajax_view(request):
        # some random context
        context = Context({'items': range(100)})
        # passing the template_name + block_name + context
        return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
        return HttpResponse(return_str)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看