Javascript 在django中使用ajax的更好方法
前几天,我为我一直在开发的Django应用程序编写了一些AJAX 我来自RubyonRails,所以我在原始JS方面做得不多 因此,基于Rails的部分,我在一种伪代码中使用了类似于以下内容的东西,不用担心细节: 1) 使用prototype的Ajax.Updater的JS函数('tablediv'是我想要Ajaxily更新的表的id,url指向正确的django视图) 2) django视图,该视图获取新数据以填充表:Javascript 在django中使用ajax的更好方法,javascript,python,ajax,django,Javascript,Python,Ajax,Django,前几天,我为我一直在开发的Django应用程序编写了一些AJAX 我来自RubyonRails,所以我在原始JS方面做得不多 因此,基于Rails的部分,我在一种伪代码中使用了类似于以下内容的东西,不用担心细节: 1) 使用prototype的Ajax.Updater的JS函数('tablediv'是我想要Ajaxily更新的表的id,url指向正确的django视图) 2) django视图,该视图获取新数据以填充表: def ajaxTable objects = Objects
def ajaxTable
objects = Objects.object.all...
return render_to_response('ajaxtable.html',objects)
3) ajaxtable.html只是一种Rails的“部分”,因此基本上是一个不带代码的表:
<th>{{object.data}}</th>
<td>{{object.moredata}}</td>
{{object.data}
{{object.moredata}
所以我的实际问题是:
这对我来说似乎有点骇人听闻,在厌倦了在网上搜索我想要的东西后,我把它拼凑了起来
是这样做的吗?它很好用,我只是知道的不够多,你知道吗?它到底有什么不对劲的地方?似乎是做某事的一种完全有效的方式 我想另一种选择是使用json并将其发送回javascript代码段 无论如何,您至少需要两件事:
所以我认为你的想法是对的。继续。我想这取决于你想做什么。Ajax是一种非常广泛的场景,从GoogleMaps到简单的自动完成,其复杂性和最佳方法都有很大的不同 但是,您可以做一些有用的事情来帮助您 1) 模板级别 确保在模板上下文处理器设置中有“django.core.context\u processors.request”。然后你可以这样做
{% if not request.is_ajax %}
<html>
<head>
...
</head>
<body>
...
{% endif %}
actual content
{% if not request.is_ajax %}
</body>
</html>
{% endif %}
上面的方法实际上与您的方法没有什么不同,但是允许您重用视图并更简洁地编写它。我不会真的说你所做的是错误的或有问题的,但是你可以编写它使它更简洁,并重用模板和视图
例如,您可以只使用一个模板,如果是Ajax请求,则只返回需要更新的部分。在您的情况下,将是表视图。我迟到了,但我想记录如何组合和调整 在某种程度上,它将解析一个更干净的模板代码 我有一个代表联系人的模型 获取一个联系人的(通用)视图如下所示:
def contcactperson_detail_view(request, name):
try:
person = ContactPerson.objects.get(slug=name)
except:
raise Http404
if request.is_ajax():
return contcactperson_detail_view_ajax(request, person)
return list_detail.object_detail(
request,
queryset = ContactPerson.objects.all(),
object_id = person.id,
template_object_name = "contactperson",
)
@render_to('cms/contactperson_detail_ajax.html')
def contcactperson_detail_view_ajax(request, person):
return {'contactperson':person, 'is_ajax':True}
<h1>{{ contactperson.first_name }} {{ contactperson.family_name }}</h1>
{% include 'cms/contactperson_detail_photo.html' %}
{% include 'cms/contactperson_detail_textpane.html' %}
呈现处理一个联系人的视图的模板称为contcactperson\u detail\u view.html
:
{% extends "index.html" %}
{% block textpane %}
<h1 id="mainheader">{{ contactperson.first_name }} {{ contactperson.family_name }} </h1>
<div class="indentation"> </div>
{% include 'cms/contactperson_detail_photo.html' %}
<div id="text_pane">
{% include 'cms/contactperson_detail_textpane.html' %}
</div>
{% endblock %}
如果请求不是ajax,将使用这3个模板
但是如果请求是ajax,contcactperson\u detail\u view
将返回视图contcactperson\u detail\u view\u ajax
,该视图使用模板contactperson\u detail\u ajax.html
进行渲染。该模板如下所示:
def contcactperson_detail_view(request, name):
try:
person = ContactPerson.objects.get(slug=name)
except:
raise Http404
if request.is_ajax():
return contcactperson_detail_view_ajax(request, person)
return list_detail.object_detail(
request,
queryset = ContactPerson.objects.all(),
object_id = person.id,
template_object_name = "contactperson",
)
@render_to('cms/contactperson_detail_ajax.html')
def contcactperson_detail_view_ajax(request, person):
return {'contactperson':person, 'is_ajax':True}
<h1>{{ contactperson.first_name }} {{ contactperson.family_name }}</h1>
{% include 'cms/contactperson_detail_photo.html' %}
{% include 'cms/contactperson_detail_textpane.html' %}
希望对一些人有用。如果是,请留下评论 这就是我一直在玩的东西,但当时我对javascript的了解还不如我所知道的那么多,所以只需将对象作为JSON发送,从中生成javascript对象文字,然后tablediv.innerHTML=foo?JSON是一个对象文字,所以在javascript中使用它的好处是,一旦有了它,就不必对它做任何事情来实际使用它。我喜欢将JSON与我上面链接的模板系统(jquery,不是prototype,抱歉)结合使用,因为您只需将返回的JSON直接传递给您设置的模板,它就会工作。很好,感谢您的回复,我完成了项目并继续前进,但从那以后它一直困扰着我(当我在某件事情的中间,我不能停下来问论坛或堆栈溢出……我没有耐心:),很高兴知道我的直觉并不是完全可笑的。这似乎真的很聪明,因为使用了对我有吸引力的嵌入式ruby…可能太聪明了…太聪明了?我真的很喜欢它。你可以快速地完全ajax化一个网站的大部分内容,不幸的是,没有办法让每个模板拥有一个以上的“ajax块”…嗯,我想知道它有多聪明你可以这样做。我相信你可以通过使用一个视图实现一个更简单的解决方案,对于ajax/非ajax使用相同的模板,但根据上下文变量从不同的基础模板继承。请参阅我对这一行中另一个问题的回复
{% with contactperson.photo.detailphoto as pic %}
{% with pic.url as pic_url %}
<div {% if not is_ajax %}id='imageContainer'{% endif %} style="float: right;padding-right:0.5em;
padding-bottom: 1em; padding-left:0.5em;clear:both;
width:{{ pic.width }}px">
<div style="width:{{ pic.width}}px">
<img style="clear:both" src="{{ pic_url }}" alt="{{ i.name }}"/>
</div>
</div>
{% endwith %}
{% endwith %}
<h1>{{ contactperson.first_name }} {{ contactperson.family_name }}</h1>
{% include 'cms/contactperson_detail_photo.html' %}
{% include 'cms/contactperson_detail_textpane.html' %}
$("#contact_person_portlet a").click(function(event){
event.preventDefault();
$.ajax({
type: "GET",
url: event.target.getAttribute('href'),
success: function(msg){
overlay(msg);
}
});
});