在Ajax请求后返回用于模板呈现的Django模型

在Ajax请求后返回用于模板呈现的Django模型,ajax,django,jquery,django-models,django-templates,Ajax,Django,Jquery,Django Models,Django Templates,我想为我的网页创建一个基于AJAX的搜索。到目前为止,我能够发送表单数据并对Django模型进行适当的调用。我现在很难处理的是将Queryset发送回来并使用Django模板系统进行渲染。非常感谢你的帮助/建议 这是我正在使用的代码 views.py if request.is_ajax(): if request.method == 'POST': format = 'json' mimetype = 'application/json'

我想为我的网页创建一个基于AJAX的搜索。到目前为止,我能够发送表单数据并对Django模型进行适当的调用。我现在很难处理的是将Queryset发送回来并使用Django模板系统进行渲染。非常感谢你的帮助/建议

这是我正在使用的代码

views.py

if request.is_ajax():
    if request.method == 'POST':
        format = 'json'
        mimetype = 'application/json'
        try:
            q = request.POST['obj']
            o = Object.objects.filter(name__icontains=q)
            return render_to_response( 'project_view_objects.html', {'username': request.user.username, 'results':o})
view.html

<script>
    $(document).ready(function(){

    $("#search_form").submit(function(event)
    {
        event.preventDefault();


        $.ajax({
            type: "POST",
            url: "/objects/search/",
            data: $(this).serialize(),
            processData: false,
            dataType: "json"
            });
    });});
</script>

<article>
    <blockquote>
        <form class="create_form" id="search_form">
            <p>
                <input id="objectSearchNameInput" type="text" name="obj" value="Object name">
                <input type="submit" value="search objects">
            </p>
        </form>
    </blockquote>
</article>
<br />

{% if results %}
<blockquote>
    <aside class="column">
        {% for object in results %}
            <b><a href="#" class="extra-text-special">{{ object.name }}</a></b><br />
        {% endfor %}
    </aside>
    <aside class="column">
        {% for object in results %}
            <font class="extra-text-nospecial">{{ object.created_when }}</font><br />
        {% endfor %}
    </aside>
</blockquote>
{% else %}
    <p>haha</p>
{% endif %}

$(文档).ready(函数(){
$(“#搜索表格”)。提交(功能(事件)
{
event.preventDefault();
$.ajax({
类型:“POST”,
url:“/objects/search/”,
数据:$(this).serialize(),
processData:false,
数据类型:“json”
});
});});

{%endfor%} {results%%中对象的%s} {{object.created_when}}
{%endfor%} {%else%} 哈哈

{%endif%}

目前,我在页面上看到的只是“哈哈”。

我的解决方案是使用Dajax,创建小片段模板,例如呈现列表。然后在Dajax函数中呈现它们,并使用适当的javascript调用将它们写入文档中。您可以在上看到一个示例(实际上,dajax的所有文档都非常好):

我最近发现的另一个解决方案(但我自己没有尝试过)是:


最后,您可能会完全相反地使用Backbone.js,但这样您(或多或少)会遇到同样的问题,即如何与django模板共享主干模板(我认为您应该能够编写模板标记,该标记依赖于“模式”写入值或主干模板标记,从而允许您重用模板)

我的解决方案是使用Dajax,创建小片段模板,例如呈现列表。然后在Dajax函数中呈现它们,并使用适当的javascript调用将它们写入文档中。您可以在上看到一个示例(实际上,Dajax的所有文档都很好):

我最近发现的另一个解决方案(但我自己没有尝试过)是:


最后,您可能会完全相反地使用Backbone.js,但这样您(或多或少)会遇到同样的问题,即如何与django模板共享主干模板(我认为您应该能够编写模板标记,该标记依赖于“模式”写入值或主干模板标记,从而允许您重用模板)

您缺少的是,在启动AJAX时,模板已经呈现出来了——这当然是必须的,因为模板是服务器端的,javascript是客户端的


因此,要做的事情是让Ajax视图不返回JSON,而是返回呈现的模板,然后Javascript回调将这些模板插入模板。

您缺少的是,在启动Ajax时模板已经呈现出来了,这当然是必须的,因为模板是服务器端的,Javascript是客户端的-一边


因此,要做的事情是让Ajax视图不返回JSON,而是返回呈现的模板,然后Javascript回调将这些模板插入到模板中。

这是最终答案

蟒蛇

if request.is_ajax():
    if request.method == 'POST':
        format = 'json'
        mimetype = 'application/json'
        try:
            q = request.POST['obj']
            #message = {"object_name": "hey, you made it"}
            o = Object.objects.filter(name__icontains=q)
        except:
            message = {"object_name": "didn't make it"}
        #m = str(q['id'])
        #json = simplejson.dumps(message)
        #data = serializers.serialize(format, o)
        #return HttpResponse(data, mimetype)

        html = render_to_string( 'results.html', { 'username': request.user.username, 'objects': o } )
        res = {'html': html}
        return HttpResponse( simplejson.dumps(res), mimetype )
html


$(文档).ready(函数(){
$(“#搜索表格”)。提交(功能(事件)
{
event.preventDefault();
$.ajax({
类型:“POST”,
url:“/objects/search/”,
数据:$(this).serialize(),
processData:false,
数据类型:“json”,
成功:功能(数据){
$('#results').html(data.html);
}
});
});});
。 .





这是最后的答案

蟒蛇

if request.is_ajax():
    if request.method == 'POST':
        format = 'json'
        mimetype = 'application/json'
        try:
            q = request.POST['obj']
            #message = {"object_name": "hey, you made it"}
            o = Object.objects.filter(name__icontains=q)
        except:
            message = {"object_name": "didn't make it"}
        #m = str(q['id'])
        #json = simplejson.dumps(message)
        #data = serializers.serialize(format, o)
        #return HttpResponse(data, mimetype)

        html = render_to_string( 'results.html', { 'username': request.user.username, 'objects': o } )
        res = {'html': html}
        return HttpResponse( simplejson.dumps(res), mimetype )
html


$(文档).ready(函数(){
$(“#搜索表格”)。提交(功能(事件)
{
event.preventDefault();
$.ajax({
类型:“POST”,
url:“/objects/search/”,
数据:$(this).serialize(),
processData:false,
数据类型:“json”,
成功:功能(数据){
$('#results').html(data.html);
}
});
});});
。 .





谢谢,我正在寻找一个使用Django模板的解决方案。然后我会使用前两个解决方案中的一个。谢谢,我正在寻找一个使用Django模板的解决方案。然后我会使用前两个解决方案中的一个。谢谢你的建议。我使用了render\u_字符串,然后以{'html':html}格式将呈现的html作为json发送回,如果成功函数的参数名为data,则可以通过data.html访问它。感谢您的建议。我使用了render_to_字符串,然后以{'html':html}格式将呈现的html作为json发送回如果success函数的参数名为data,则可以通过data.html访问它。
<article>
    <blockquote>
        <form class="create_form" id="search_form">
            <p>
                <input id="objectSearchNameInput" type="text" name="obj" value="Object name">
                <input type="submit" value="search objects">
            </p>
        </form>
    </blockquote>
</article>
<br />
<aside id="results">
</aside>