【问题标题】:django.core.paginator Ajax pagination with jQuerydjango.core.paginator 使用 jQuery 进行 Ajax 分页
【发布时间】:2011-06-04 05:54:15
【问题描述】:

问题

我需要在 Django 模板中使用 jQuery 进行 Ajax 分页。

情况

我的模板中有以下代码:

<script type="text/javascript">
$(document).ready(function() {
    $("#next-page").click(function() {
        var page = {{ vms.next_page_number }};
        $("#vms").html('&nbsp;').load (
            '{% url virtualmachine-list %}?page=' + q );
    });
});
</script>

[code omitted]

<table>
<thead>

    [code omitted]

</thead>
<tbody id="vms">
    {% for vm in vms.object_list %}

         [code omitted]

    {% endfor %}
</tbody>
</table>


[code omitted]

{% if vms.has_next %}
    <!--<a href="?page={{ vms.next_page_number }}" id="next-page">Next</a>-->
        <a href="#" id="next-page">Next</a>
    {% endif %}
</span>

我的看法:

def list_(request):
    vms = VirtualMachine.objects.all()
    paginator = Paginator(vms, 10)

    page = 1
    if request.is_ajax():
        query = request.GET.get('page')
        if query is not None:
            page = query

    try:
        vms = paginator.page(page)
    except (EmptyPage, InvalidPage):
        vms = paginator.page(paginator.num_pages)

    return render_to_response('virtual_machine/list.html', {
        'vms': vms,
        },
        context_instance=RequestContext(request),
    )

结论

所以,每当我按“下一步”时,它实际上会执行 Ajax 请求,但数据不会呈现在表中。

使用 django.core.paginator 进行分页,如果可能的话,我真的很想坚持下去。

您能看到代码中缺少什么/错误吗?

【问题讨论】:

    标签: jquery ajax django django-templates


    【解决方案1】:

    我没有发现错误,但我在下面向您展示了我是如何解决此任务的。我认为你可以很容易地适应你的需要。

    jquery ajax 部分:

    <script type="text/javascript">
    function ajax_get_update()
        {
           $.get(url, function(results){
              //get the parts of the result you want to update. Just select the needed parts of the response
              var table = $("table", results);
              var span = $("span.step-links", results);
    
              //update the ajax_table_result with the return value
              $('#ajax_table_result').html(table);
              $('.step-links').html(span);
            }, "html");
        }
    
    //bind the corresponding links in your document to the ajax get function
    $( document ).ready( function() {
        $( '.step-links #prev' ).click( function(e) {
            e.preventDefault();
            url = ($( '.step-links #prev' )[0].href);
            ajax_get_update();
        });
        $( '.step-links #next' ).click( function(e) {
            e.preventDefault();
            url = ($( '.step-links #next' )[0].href);
            ajax_get_update();
    
        });
    });
    
    //since the links are reloaded we have to bind the links again
    //to the actions
    $( document ).ajaxStop( function() {
        $( '.step-links #prev' ).click( function(e) {
            e.preventDefault();
            url = ($( '.step-links #prev' )[0].href);
            ajax_get_update();
        });
        $( '.step-links #next' ).click( function(e) {
            e.preventDefault();
            url = ($( '.step-links #next' )[0].href);
            ajax_get_update();
        });
    });
    </script>
    

    模板html部分:

    <div class="pagination">
                <span class="step-links">
                    {% if object_list.has_previous %}
                    <a id="prev" href="?{{ urlquerystring_previous_page }}">previous</a>
                    {% else %}
                    <span style="visibility:hidden;">previous</span>
                    {% endif %}
    
                    <span class="current">
                    Page {{ object_list.number }} of {{ object_list.paginator.num_pages }}.
                    </span>
    
                    {% if object_list.has_next %}
                                <a id="next" href="?{{ urlquerystring_next_page }}">next</a>
                    {% else %}
                                <span style="visibility:hidden;">next</span>
                    {% endif %}
                </span>
            </div>
    
                <form class="" id="action-selecter" action="{{ request.path }}" method="POST">
    
                <div id="ajax_table_result">
                    <table class="w600" cellspacing="5">
                        <thead>
                            {% table_header headers %}
                        </thead>
                            <tbody>
                              ....
    

    【讨论】:

    • 天啊!没想到会有这样的答案……我马上试试。
    • 它可以工作,除了你的 urlquerystring_next_page 和 urlquerystring_previous_page 模板标签,但这并不重要。非常感谢。
    • :) 很高兴能帮到你!如果你想深入研究这个 urlquerystring_previous_page 的东西,看看这里。 pastebin.com/FKAbCeWG 这是我在视图中用来创建这个上下文变量的代码。
    • @ThomasKremmel 它似乎每秒钟才起作用。例如,如果您有五个页面,您首先转到第 2 页,它可以工作,但是当我转到第 3 页时,它会重新加载整个 html 页面。我发现 ajaxStop() 没有被调用,我认为这是导致问题的原因。有人知道吗?
    • 我找到了我的问题的原因,我想知道托马斯的回答是否真的是一个解决方案。您正在尝试收听正在更新的事件。我认为 ajaxStop 应该绑定新链接,但在我的情况下它没有。相反,我使用了 .on()。上面的代码可以重写like this
    【解决方案2】:

    应该是request.is_ajax()is_ajax()是一个方法!

    【讨论】:

    • 如果是评论,我会给你 1 分,因为这不是问题的完全答案。
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多