【问题标题】:Best practice for rendering data into html with ajax使用 ajax 将数据渲染为 html 的最佳实践
【发布时间】:2016-10-18 23:04:00
【问题描述】:

我正在尝试在某些已定义的 div 中加载该项目的单击该项目的一些详细信息。我有两种方法可以做到这一点。

注意:我使用 python/django 作为后端,在前端使用 jquery

我。我的第一种方式

Views.py

def get_item_data(id):
    obj = MyClass.objects.get(pk=id)
    html = """
              <div>All Details Here, 1. {0}, 2. {1}</div>
           """.format(str(obj.id), str(obj.name))

    return HttpResponse(html)

myapp.js

$('#myid').on('click', function(){
     $.ajax({
        type: "GET",
        url: GET_DATA,
        data: dataString,
        success: function(res) {
                $('#addl_container').html(res);
        }
    });
});

二。另一种方式

Views.py

def get_item_data(id):
    obj = MyClass.objects.filter(pk=id).values()
    return HttpResponse(simplejson.dumps(obj))

myapp.js

$('#myid').on('click', function(){
     $.ajax({
        type: "GET",
        url: GET_DATA,
        data: dataString,
        success: function(res) {
                $('#addl_container').html(
                   "<div>All Details Here, 1. "+ res.id +", 2. "+ res.name + "</div>"
                );
        }
    });
});

这两个过程都有效。 我认为事先创建 html 并加载它可能不是一个好的选择,因为我们使用 python 代码创建 html 然后加载它。如果我尝试从不同的应用程序访问相同的 url,它也不会工作。 通过从 json 响应中提取数据从 jquery 中创建 html 似乎是一个不错的解决方案,但有时当数据很大时,它需要在用户端使用更多 ram,这会使系统变慢。

我很困惑使用哪一个,请从这两个中提出一个更好的解决方案。如果有的话,还建议其他比这更好的解决方案吗?

提前致谢。

【问题讨论】:

  • 在我看来,这取决于您渲染 HTML 的数量和频率。因此,例如,如果您只需要渲染一个小的 &lt;span&gt;,那么您的操作方式就可以了。但是如果你需要渲染一些大的 HTML,那么最好使用像 Handlebars 这样的模板引擎
  • Javascript = 客户端处理。 Php = 服务器处理。如果你有一个体面的服务器,第二个对用户来说会更好。许多用户仍然拥有相对较旧的 PC,或者,对于工作而言,可能被认为是动力不足的 PC,尤其是与开发人员的 PC 相比时。在客户端上运行过多会影响性能/用户体验。
  • 另一种方式,如果你有一个更大的 html,那么你可以在 get_item_data 中定义模板并返回该模板
  • 问得好人,你有一个美好的未来:D
  • 我更喜欢使用 django 的 render_to_string 方法。因此,我的视图实际上呈现了我的模板并通过 HttpResponse 将其返回给我的 ajax 请求。然后只需使用 javascript 将其插入到当前模板中。我更喜欢这种方法,因为它从字符串中提取原始 html,并将其保存在 html 模板中,而不是保存在视图或 javascript 中的字符串中。另外,它还允许您像使用普通 django 模板一样使用 django 的模板标签,并且您可以将上下文传递给该模板。

标签: javascript jquery python ajax django


【解决方案1】:

我更喜欢尽可能的将模板、业务和js逻辑分开。它使它更加pythonic并且更多地符合django设计原则。这确实与您的第一种方法非常相似,但使用的是 html 模板,而不是在您的视图中将 html 打印到字符串。

views.py

def get_item_data(id):
    template_name = 'index.html'
    obj = MyClass.objects.get(pk=id)
    context = {
        'obj': obj,
    }
    html = render_to_string(template_name, context)
    return HttpResponse(html)

index.html

<h1>{{ obj }}</h1>

myapp.js

$('#myid').on('click', function(){
    $.ajax({
        type: "GET",
        url: GET_DATA,
        data: dataString,
        success: function(res) {
            $('#addl_container').html(res);
        }
    });
});

【讨论】:

  • 这里的问题是,如果这是一个 api url,我想从另一个站点访问它,我只想要 json 响应与 html。
  • 没关系,您仍然可以在数据上使用return HttpResponse(json.dumps(data))。我认为只要你知道目的,你可以去任何一种方式并相应地调整。顺便问下好问题
【解决方案2】:

非常粗略的草图,来自我实际使用的,即Handlebar

在 Django 模板中。 头部

<!--Handlebar templates start-->
{% include "app/mydiv.handlebars.html" %}
<!--Handlebar templates end-->

app/mydiv.handlebars.html

{% verbatim %}
<script id="template-myapp-my-div" type="text/x-handlebars-template">
<div>All Details Here, 1.{{res.id}} res.id, 2. {{res.name}}</div>
</script>
{% endverbatim %}

在 JS 中是这样的:

_success = function(json_data_from_response) { 
var templateSource = $("#template-myapp-mydiv").html();
if (!templateSource) {
    $("#errors").html("template-myapp-mydiv:error:no template found");
    return;
}
// you could compile ahead of time elsewhere or cache the compile.
var template = Handlebars.compile(templateSource);

// now merge your incoming data.
var myhtml = template(json_data_from_response);
$("#addl_container").html(myhtml);
);

我没有详细介绍 Handlebars 模板的详细信息,但它们与 Django 模板有 80% 的相似性,只是去掉了标签和过滤器,所以你应该很容易。

使用 Handlebars 的另一个好处是它可以在客户端提供 sprintf/python 类型的字符串替换。有点重量级的用途,但如果你有它的话......

//compute an actual url on the fly from a template (i.e. depending on
//what the user clicked on, I compute what to fetch)

var _url = _settings.url_details_base;
var t_url = Handlebars.compile(_url);
var url = t_url({"CREF": CREF,"rdbname" : rdbname});

//do something with url, like an Ajax call.

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多