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

Mar*_*cin 8 python django ajax jquery json

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

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

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

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

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

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

Hut*_*tch 8

记住,仅仅因为它是ajax并不意味着你需要返回一个json转储.您确实可以返回渲染的模板.

确实,'正确的方法'是在javascript中构建你的所有标签,并用json数据填充那些数据,但让我们面对它,这就是臀部的痛苦...以至于它们是如此开发一个jquery模板语言.

您也不能只转储查询集.您需要手动构建json数据.所有这些教程和建议似乎都掩盖了这一事实.来自django文档:

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)
Run Code Online (Sandbox Code Playgroud)

我所做的实际上是为新的基于类的视图编写一个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()    
Run Code Online (Sandbox Code Playgroud)

这允许我只编写一次模板,然后无需在javascript中手动构造dom元素.这是非常少的额外工作,特别是如果你不写api,那就是要走的路.


Chr*_*att 5

我建议您只创建自己的javascript和AJAX视图.Ruby on Rails长期以来遇到了相反的问题:迫使人们以某种​​方式做AJAX,这对人们来说总是一个冲突点.最近,他们终于意识到了他们的愚蠢,并将AJAX与框架分离,因此您可以轻松使用您喜欢的任何库.

这是Django的一个功能.这似乎更难,但相信我,它最终会无限制地控制端到端.


Ant*_*off 2

在 python 方面,我建议查看pistontastypie

\n\n

(从我自己的 AJAX + Django 开始,我也找到了 Dajax,但是使用piston\xe2\x80\x94 对我来说感觉更多 \xe2\x80\x98unix-way\xe2\x80\x99,不喜欢这些 all-in-一种解决方案。虽然活塞已经很长时间没有更新了,所以我推荐tastypie,它是积极维护的。)

\n\n

编辑。还有一个类似的项目,django-rest-framework. 我自己还没用过,很新。

\n\n

基本上,这些库可帮助您为模型创建一个完全工作的读写 API,以便您可以通过 HTTP 从 javascript 执行创建-读取-更新-删除操作。您不需要定义任何视图或序列化器。相反,您定义resources,我认为这是一个不错的抽象。

\n\n

通常只需要几行代码,特别是当您的资源与模型绑定时。

\n\n

但是,如果您需要更复杂的东西,您可以重新考虑您的设计并写下您的观点。使用基于类的视图,这也很容易。例如,看一下这个片段。

\n