如何在返回的 AJAX 调用上使用 django 模板标签?

Posted

技术标签:

【中文标题】如何在返回的 AJAX 调用上使用 django 模板标签?【英文标题】:How to use django template tags on returned AJAX calls? 【发布时间】:2015-07-21 10:12:44 【问题描述】:

我有一个简单的 AJAX 脚本,它在名为 AJAXBox 的搜索字段中输入一个输入字符串,并调用一个视图函数,该函数使用过滤器查询数据库并返回与输入参数匹配的所有用户对象的查询集。当我使用 django 模板标签遍历查询集时,它不起作用。我认为这是因为我的 javascript 调用的输出实际上并未输出查询集,而是 django 模板无法识别的某种类型的字符串。我该如何解决这个问题,以便我的 AJAX 调用返回 django 中的正常渲染函数输出的真正的 django 兼容查询集?

AJAX 的 JS:

$(document).ready(function()

$('#AJAXBox').keyup(function()  

    var searchedterm;
    searchedterm = $(this).val();
    $.get('/AJAXsearch/', searchterm: searchedterm, function(data)
        $('#result').html(data);

      );       

    );  
);

python 代码的 tl;dr 本质上是:

def AJAXsearch(request):
    searchterm = request.GET['searchterm']
    result = UserObj.objects.filter(person_name=searchterm)
    return HttpResponse(result)

当我转到模板中的 html 并执行以下操作时:

<div id="result">
    % for person in result %
        person.property
    %endfor%
</div>

模板标签循环不做任何事情。事实上,我根本无法操纵/设计输出,它只是一个普通的用户名字符串。

【问题讨论】:

【参考方案1】:

您没有在视图中调用您的模板。

试试这个:

def AJAXsearch(request):
    searchterm = request.GET['searchterm']
    result = UserObj.objects.filter(person_name=searchterm)
    return render(request,"path/to/your/template.html", "result":result)

根据 cmets,您正在重用页面的主代码以及生成 &lt;div&gt; 块的代码。

在这种情况下,我建议将该块放入一个单独的文件中,例如 "resultlist.html" 和 including that in your main template 所以:

resultlist.html:

<div id="result" >
% for person in result %
person.property
%endfor% </div>

然后在userprofile.html:

# Lots of code around the result list #
% include "resultlist.html" %
# Lots of code around the result list #

【讨论】:

这似乎奏效了!但是,我用来格式化结果的模板也用于整个页面的设计,因此每当调用 AJAXsearch 函数并呈现模板时,它会在结果 div 中再次呈现整个页面,并带有结果变量。如果可能的话,如何让渲染功能仅适用于模板内的特定 div?我尝试为 ajax 结果创建一个全新的 html 模板,并让 AJAXsearch 函数将其呈现为输出,但它不起作用。 那么您的模板中显然还有其他代码。剩下的可以发吗? 是的,我愿意。我不是为了隐私或任何事情而截断它,只是为了简洁。它基本上只是一堆用于呈现用户个人资料页面不同部分的代码。只是 html/变量块。结果 div 正好放在页面搜索栏的正下方。本质上发生的是,当我现在使用您的修复进行 ajax 调用时,一个较小/新的整个用户配置文件页面将全部加载到结果 div 标记中,其中包含正确的搜索结果。但很明显,我只想渲染结果 div,而不是 ENTIRE 模板的另一个实例。 @EazyC 我已经更新了答案,基本上你需要一个模板仅用于结果列表,并且可能将其包含到主模板中。

以上是关于如何在返回的 AJAX 调用上使用 django 模板标签?的主要内容,如果未能解决你的问题,请参考以下文章

使用django时如何在ajax调用中传递request.user?

ajax请求返回django.urls.exceptions.NoReverseMatch后Django反向和重定向

如何使用 AJAX 刷新 Django 页面的一部分?

如何使用 javascript/jquery/AJAX 调用 Django REST API?

如何在 Django 中使用 Ajax JQuery 调用下拉列表 html 选择

如何访问由 AJAX 响应返回到模板的查询集 - Django