0

在过去的几天里,我浏览了一些“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 以将该特定 url 重定向到另一个视图,该视图会将新的保管箱值存储在我的数据库中。那部分效果很好,但是当然我在原始视图中已经有了所有这些逻辑,这些逻辑不再有效,因为下拉值在幕后发生了变化。一旦我强制刷新页面,所有内容都会正确更新以反映新值。我想知道是否有一种简单的方法我仍然可以使用现有的逻辑(即显示这个表单或隐藏那个表单)而不必在我的模板中编写一堆 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. 创建一个新视图,您需要根据 url 中的“提交”更新您的 urls.py 来调用它。这个视图简单地调用原始视图,带有一个额外的参数:

    def new_view(request):
        return original_view(request, repost=True)
    
  3. 更新我的原始视图以具有“重新发布”参数。其他一切都保持不变,除了最后我更改了它返回的模板:

    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。

再次感谢伊格纳西奥

4

1 回答 1

1

将您的模板分割成逻辑片段,您可以通过模板标签实现这些逻辑片段。然后,您可以将模板标签委托给视图函数的函数包装起来,并通过 AJAX 调用这些函数,替换为<div>页面中的适当 s。

于 2012-04-18T03:31:18.287 回答