Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Ajax调用后使用Django模板呈现JSON对象_Python_Ajax_Django_Json_Templates - Fatal编程技术网

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

Python 在Ajax调用后使用Django模板呈现JSON对象,python,ajax,django,json,templates,Python,Ajax,Django,Json,Templates,我一直在试图弄清楚在中国什么是最好的方式。通过阅读这里和那里的资料,我总结出常见的过程是: 使用一些库(例如)来制定Ajax调用,在Django中设置一个URL模式来捕获调用并将其传递给视图函数 在view函数中,检索您感兴趣的对象,并将它们以JSON格式或类似格式发送回客户端(通过使用内置序列化程序模块,或) 在JavaScript中定义一个回调函数,用于接收JSON数据并对其进行解析,以便创建需要显示的任何HTML。最后,JavaScript脚本将HTML放在它应该停留的地方 现在,我仍然不

我一直在试图弄清楚在中国什么是最好的方式。通过阅读这里和那里的资料,我总结出常见的过程是:

  • 使用一些库(例如)来制定Ajax调用,在Django中设置一个URL模式来捕获调用并将其传递给视图函数

  • 在view函数中,检索您感兴趣的对象,并将它们以JSON格式或类似格式发送回客户端(通过使用内置序列化程序模块,或)

  • 在JavaScript中定义一个回调函数,用于接收JSON数据并对其进行解析,以便创建需要显示的任何HTML。最后,JavaScript脚本将HTML放在它应该停留的地方

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

    我找到的唯一的资源就是这个方向,但我还没有尝试过。 显然,在这种情况下,所有生成的HTML都是在服务器端创建的,然后传递给客户机。JavaScript回调函数只需在正确的位置显示它

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

    非常感谢


    更新:请使用,因为它是上述版本的增强版我发现继承支持通过这种方式工作得更好。

    当您使用Ajax时,我认为您对模板没有任何用处。 模板的存在使您可以轻松地在服务器端生成动态HTML,因此它在HTML中提供了很少的编程挂钩

    在Ajax的情况下,您传递的是JSON数据,您可以在Python中根据需要对其进行格式化。 客户端的一些JavaScript库(例如客户端的jQuery)将使用JSON在客户端生成HTML/文档元素

    如果您有一个非常具体的案例,从服务器端HTML替换一些内部HTML,那么您可能可以使用模板,但在这种情况下,为什么需要JSON?
    您可以通过Ajax查询HTML页面,并更改内部或外部或任何HTML。

    模板用于演示。使用格式为X的数据(JSON、XML、*ml等)进行响应不是表示,所以您不需要模板。只需将数据序列化为X格式,并以HttpResponse的形式返回即可。

    没有理由不能使用Ajax返回呈现的HTML,并在需要的位置将其插入现有页面。显然,如果您愿意,您可以使用Django的模板来呈现这个HTML。

    以下是我如何将相同的模板用于传统呈现和Ajax响应呈现

    模板:

    <div  id="sortable">
    
    {% include "admin/app/model/subtemplate.html" %}
    </div>
    

    当然,您可以使用render\u to\u响应。但是我喜欢那些讨厌的装饰师:嘿,谢谢vikingosegundo

    我也喜欢使用装饰器:-)。 但与此同时,我一直在遵循上面提到的片段所建议的方法。唯一的一件事是,改用它,因为它是原版本的改进版。下面是它的工作原理:

    假设您有一个模板(例如“subtemplate.html”),其大小不限,其中包含一个可重用的有用块:

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

    不幸的是,Django模板设计为仅在服务器端执行。有Django模板使用Javascript,但我还没有使用它,所以我不知道它有多快,有多好的支持,或者是多新。除此之外,您必须在服务器上使用Django模板,或者在客户端生成动态元素,而不使用模板。

    虽然模板确实只是用于演示目的,但无论您是在服务器端还是客户端执行此操作都不重要。这一切归结为将执行操作的控制逻辑与仅负责创建标记的视图逻辑分离。如果您的javascript控制逻辑必须处理如何呈现或显示HTML,那么您可能做错了,但是如果您将该呈现逻辑隔离到另一个对象或函数,并仅向其传递呈现所需的数据,那么您应该没事;它反映了我们如何在服务器端分离控制器、模型和视图

    看看github项目:


    它将django模板编译成优化的javascript函数,这些函数将使用您传递的数据生成演示html。编译后的函数是纯javascript的,因此不依赖于其他库。由于模板是编译的,而不是在运行时进行解析,因此字符串和变量都已放入javascript字符串中,只需连接这些字符串,因此与需要进行dom操作或脚本解析以获得最终表示的技术相比,您可以获得巨大的速度提升。现在只有基本的标签和过滤器,但对于大多数事情来说应该足够了,当人们开始向他们提出请求或开始为项目做出贡献时,会添加更多的标签

    您可以使用
    jquery.load()
    或类似工具,在服务器上生成HTML并使用JavaScript将其加载到DOM中。我想有人把这个叫做AJAH。

    谢谢你的回答-是的,你是对的,我指的是当你必须从服务器端替换一些内部HTML时的情况(例如,以重复结构显示的一长串数据,类似于表格)-在这种情况下,如果我决定在应用程序后端构建HTML,则根本不需要JSON。我只是想知道这样做是否会比在客户端使用javascript创建HTML慢
    @login_required
    @render_to('admin/app/model/subtemplate.html')#annoying-decorator
    def ajax_view(request):
        .....
    
        return { 
            "results":Model.objects.all(),
        }      
    
         ........
        <div id="results">          
            {% block results %}
                {% for el in items %}
                       <li>{{el|capfirst}}</li>
                {% endfor %}
            {% endblock %}      
        </div><br />
         ........
    
    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)