显然,马匹用于课程,但是将javascript库与一个Django应用程序集成的一些好方法是什么?
我打算使用jQuery,主要是因为它看起来很流行并且看起来很强大(但我对其他建议持开放态度)。
是否有非常有用或必不可少的python端库?或者最好只是创建JSON视图,并手动编写javascript(使用适当的JavaScript框架)?
我(简要地)看过Dajax,但是基于很少的文档,我不清楚它真的给了我很多。我当然更喜欢带有更多文档的东西。
这里的其他答案表明pjax不一定适用于许多浏览器,所以就这样了。
编辑:谢谢大家。我将关注tastypie以简化暴露一些json视图,并且手动编写一些javascript(今年早些时候做了一点点,看起来比90年代后期要好得多。)
答案 0 :(得分:8)
请记住,仅仅因为它是ajax并不意味着你需要返回一个json转储。你确实可以返回一个渲染模板。
确实,'正确的方法'是用javascript构建你的所有标签,并用json数据填充那些数据,但让我们面对它,这是臀部的痛苦...以至于那么多他们正在开发一种jquery模板语言。
您也不能只转储查询集。您需要手动构建json数据。所有这些教程和建议似乎都掩盖了这一事实。来自django docs:
def convert_context_to_json(self, context):
"Convert the context dictionary into a JSON object"
# Note: This is *EXTREMELY* naive; in reality, you'll need
# to do much more complex handling to ensure that arbitrary
# objects -- such as Django model instances or querysets
# -- can be serialized as JSON.
return json.dumps(context)
我所做的实际上是为基于新类的视图编写一个mixin,它可以选择模板,具体取决于是否为ajax页面加载。然后我将我想要的片段放在一个片段中,在另一个包装器模板中,扩展base.html并包含片段模板。
class AjaxTemplateMixin(TemplateResponseMixin):
ajax_template_name = None
def get_template_names(self):
if self.ajax_template_name and self.request.is_ajax():
self.template_name = self.ajax_template_name
return super(AjaxTemplateMixin, self).get_template_names()
这允许我只编写一次模板,然后无需在javascript中手动构造dom元素。这是非常少的额外工作,特别是如果你不写api,那就是你要走的路。
答案 1 :(得分:5)
我建议您只创建自己的javascript和AJAX视图。 Ruby on Rails长期存在相反的问题:迫使人们以某种方式进行AJAX,而总是是人们的冲突点。最近,他们终于意识到了他们的愚蠢,并将AJAX与框架分离,因此您可以轻松使用您喜欢的任何库。
这是Django的一个功能。这似乎更难,但相信我,它最终会无限制地控制端到端。
答案 2 :(得分:2)
我总是创建自己的视图来提供JSON,并自己编写JavaScript(通常使用jQuery)。显然,这一切都取决于你想要做什么 - 如果有一个特定的需求你已经得到了现有的应用程序解决,那么一定要使用它。
提供JSON非常简单(只需转储一些JSON并将其作为HttpResponse返回),如下所示:
def get_user_ids(request):
if not request.is_ajax():
raise Http404
return HttpResponse(simplejson.dumps({'ids': [u.pk for User.objects.all()]}))
上面的代码旨在说明,我不建议您创建一个显示所有用户ID的视图。
答案 3 :(得分:2)
在python方面,我建议您查看piston
和tastypie
。
(从我自己的AJAX + Django开始,我也找到了Dajax,但是跟piston
一起去了 - 对我感觉更'unix-way',不喜欢这些一体化的解决方案。虽然活塞没有现在已经更新很久了,所以我建议tastypie
,这是积极维护的。)
EDIT。还有一个类似的项目django-rest-framework
。从来没有使用它,它是新的。
基本上,这些库可以帮助您为模型创建一个完全可用的读写API,因此您可以通过HTTP从javascript执行create-read-update-delete操作。您无需定义任何视图或序列化程序。相反,我认为你定义了 resources ,这是一个不错的抽象。
通常只需要几行代码,特别是如果您的资源与模型相关联。
但是,如果你需要更复杂的东西,你可以重新考虑你的设计写你的观点。使用基于类的视图,它也非常简单。例如,查看this snippet。
答案 4 :(得分:1)
Dajax很直接。你最好告诉我们更多关于你在Dajax谜题的事情。