过去几天我花了一些“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更新。这是我将静态页面转换为动态页面的过程:
创建一个新的“基础”页面,如下所示:
{% 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 %}
创建一个新视图,您需要根据网址中的“提交”更新要调用的urls.py。此视图仅使用额外参数调用原始视图:
def new_view(request):
return original_view(request, repost=True)
更新我的原始视图以获得“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))
回过头来,我的“base.html”是我上面发布的简单模板。我的“new_table”模板是我的原始模板,它生成了所有动态数据。所以我所做的就是将原始模板移到其他地方,创建一个执行该模板的新视图,然后使用其结果将数据重新发布到div。
再次感谢Ignacio
答案 0 :(得分:1)
将模板分成逻辑部分,您可以通过模板标记实现这些部分。然后,您可以将模板标签委托的函数包装到视图函数中,并通过AJAX调用它们,替换为页面中相应的<div>
。