在过去的几天里,我浏览了一些“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 更新。这是我将静态页面转换为动态页面的过程:
创建一个新的“基本”页面,如下所示:
{% 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 %}
创建一个新视图,您需要根据 url 中的“提交”更新您的 urls.py 来调用它。这个视图简单地调用原始视图,带有一个额外的参数:
def new_view(request): return original_view(request, repost=True)
更新我的原始视图以具有“重新发布”参数。其他一切都保持不变,除了最后我更改了它返回的模板:
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))
回过头来,我的“base.html”是我在上面发布的简单模板。我的“new_table”模板是生成所有动态数据的原始模板。所以我所做的只是将我的原始模板移动到其他地方,创建一个执行该模板的新视图,然后我使用它的结果将数据重新发布到 div。
再次感谢伊格纳西奥