Django:在AJAX提交后重用一个视图

时间:2012-04-18 02:54:51

标签: jquery ajax django

过去几天我花了一些“Django / AJAX教程”,但我非常喜欢使用AJAX或JQuery(我决定在我的AJAX实现中使用的库,我'如果有意义的话,我可以使用别的东西。)

我想异步进行一些数据库更新,所以我不需要每次重新加载整个页面,但由于我的大多数表单的动态性,我还没有看到“简单” “没有编写大量新代码就可以做到这一点。我很好奇是否有更简单的方法去做我想要完成的事情,而不必编写那么多新代码。

我的原始应用程序是完全静态的,这意味着无论何时我发布任何数据,整个视图都需要重新加载。从好的方面来说,我很容易确定是否要显示/隐藏某个表单的某些元素,因为我基本上都在重建帖子上的所有内容。我的应用程序的一个典型示例:用户更改下拉列表中的值,我的表单重新加载并根据所选值显示或隐藏新字段:

def example_view(request):
    if "dropdown_selection" in request.GET:
        dropdown_value = request.GET['dropdown_selection'])
        # more code to save dropdown_value to my database

    .....
    # way later on in the same view
    if dropdown_value == SHOW_EXTRA_STUFF:
        # code to add a bunch of extra elements to a form

无论好坏,我在这样的视图中都有很多逻辑,根据存储在数据库中的值确定要显示/隐藏的元素(通常是事先读取传入的Post数据并保存它首先关闭数据库)。所以现在我想开始做一些异步的事情:-)

我设法连接一个简单的下拉框来通过AJAX更新我的数据库,在我的模板中有一些简单的代码:

$(document).ready(function() { 
    $('#{{dropdown_id}}').change(function() {
        var dropdown_data = $('#{{dropdown_id}}');
        var data = {}
        data["{{dropdown_id}}"] = dropdown_data.val();
        var args = { type:"GET",
            url:"submit/", data:data };
        $.ajax(args);
    })
});

我已经更新了我的urls.py,将该特定网址重定向到另一个视图,该视图会将新的保管箱值存储在我的数据库中。那部分效果很好,但当然我在原始视图中得到了所有这些逻辑,这些逻辑不再有效,因为后面的下拉值已经改变了。一旦我强制页面刷新,所有内容都会正确更新以反映新值。我想知道是否有一种简单的方法我仍然可以使用现有的逻辑(即显示此表单或隐藏该表单),而无需在我的模板中编写一堆Jquery代码,我猜这将需要访问所有这些元素直接需要一堆新逻辑。这几乎就像我想要重新完成我原始视图中的内容,减去更新数据库值的逻辑,重建所有html代码,但实际上没有进行整页刷新。也许这只是一厢情愿的想法: - /

更新 - 我的解决方案

作为后续行动,我按照Ignacio的建议完成了这项工作。我能够使用我现有的视图/逻辑并添加少量额外代码来获得完整的AJAX更新。这是我将静态页面转换为动态页面的过程:

  1. 创建一个新的“基础”页面,如下所示:

    {% block content %}
        <div id="dynamic_data">
        </div>
    
    <script>
    $(document).ready(function() { 
        $('#dynamic_data').load('submit/');
        $('#dynamic_data').change(function() {
            $('#criteria_table').load('submit/');
        });
    });
    </script>
    
    {% endblock content %}
    
  2. 创建一个新视图,您需要根据网址中的“提交”更新要调用的urls.py。此视图仅使用额外参数调用原始视图:

    def new_view(request):
        return original_view(request, repost=True)
    
  3. 更新我的原始视图以获得“repost”参数。其他所有内容保持不变,除非最后我更改它返回的模板:

    def original_view(request, repost=False):
        # all my database updates, dynamic form generation, etc
        # everything stays the same
        ...
        if repost == True:
            return render_to_response("myapp/new_table.html",
                    context,
                    context_instance=RequestContext(request))
        else:
            return render_to_response("myapp/base.html",
                    context,
                    context_instance=RequestContext(request))
    
  4. 回过头来,我的“base.html”是我上面发布的简单模板。我的“new_table”模板是我的原始模板,它生成了所有动态数据。所以我所做的就是将原始模板移到其他地方,创建一个执行该模板的新视图,然后使用其结果将数据重新发布到div。

  5. 再次感谢Ignacio

1 个答案:

答案 0 :(得分:1)

将模板分成逻辑部分,您可以通过模板标记实现这些部分。然后,您可以将模板标签委托的函数包装到视图函数中,并通过AJAX调用它们,替换为页面中相应的<div>