将Django与Ajax库集成的“最佳”方式

时间:2011-06-10 14:45:29

标签: jquery python ajax django json

显然,马匹用于课程,但是将javascript库与一个Django应用程序集成的一些好方法是什么?

我打算使用jQuery,主要是因为它看起来很流行并且看起来很强大(但我对其他建议持开放态度)。

是否有非常有用或必不可少的python端库?或者最好只是创建JSON视图,并手动编写javascript(使用适当的JavaScript框架)?

我(简要地)看过Dajax,但是基于很少的文档,我不清楚它真的给了我很多。我当然更喜欢带有更多文档的东西。

这里的其他答案表明pjax不一定适用于许多浏览器,所以就这样了。

编辑:谢谢大家。我将关注tastypie以简化暴露一些json视图,并且手动编写一些javascript(今年早些时候做了一点点,看起来比90年代后期要好得多。)

5 个答案:

答案 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方面,我建议您查看pistontastypie

(从我自己的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谜题的事情。