Django - 渲染模板并通过 AJAX 传递它们

时间:2021-01-05 15:52:53

标签: python html django ajax django-templates

好的,所以这更像是一个概念性问题。

基本上我刚刚发现我可以执行以下操作: 使用 ajax 启动一个函数,该函数返回呈现的 HTML 模板,将其作为对 ajax 的响应发送,然后将该 HTML 代码应用到主机 div。这感觉比使用包含标签更加通用和强大。 我可以用最少的 JS 在 Flash 中渲染和重新渲染表单(或任何小的 HTML 片段),最重要的是,无需刷新页面。

我知道通过 AJAX 传递整个 html 块可能不是最佳的,所以我避免滥用它。

但是这对我来说感觉很“hacky”,所以我的问题是,为什么我不应该这样做?

如果你想要一些示例代码:

{% load crispy_forms_tags %}
{% load static %}
<div id="formdiv1">

</div>
<script>
    function getform_rec() {
    $.ajax({
               type: "GET",
               url: "/backoffice/ajax/rec_form/",
               success: function(data)
               {
                   $("#formdiv1").html(data);
               }
             });

}
getform_rec()
</script>

我的观点

def  ajax_rec_form(request):
    if request.method == "GET":
        rec_id = request.GET.get("id", None)
        if not rec_id:
            form = Rec_form()
        else:
            form = Rec_form(instance=Rec.objects.get(id=rec_id))
    return render(request, "rec-form.html", {"rec_id": rec_id, "form": form})

rec-form.html 只是一个没有扩展或包含的 html 文件,它只是呈现表单。 是的,视图仍然不完整,它无法处理提交等。因为我想确保在继续这条道路之前我没有做一些非常糟糕的事情。 哦,getform_rec() 实际上是由按钮调用的,为了简单起见,我只是在加载时调用它。

1 个答案:

答案 0 :(得分:1)

您需要这样的代码:

data = loader.render_to_string(
    'rec-form.html', {"rec_id": rec_id, "form": form}
)
return JsonResponse(data)