Django和Ajax - 我该怎么办?

时间:2012-07-29 18:07:04

标签: ajax django

我几乎已经完成了我的网站,除了最后一部分,我需要让图库页面支持ajax来使用Ajax更改页码。

图库页面视图:

def gallerypages(request, page):
    items = Example.objects.all().order_by('-pk')
    categories = Categorie.objects.all()

    paginator = Paginator(items, 12)

    try:
       itemsList = paginator.page(page)
    except PageNotAnInteger:
       itemsList = paginator.page(1)
    except EmptyPage:
       itemsList = paginator.page(paginator.num_pages)

    if items.count()>1:
       return render_to_response('gallery.html', {'items': itemsList,'categories': categories,}, context_instance = RequestContext(request))

Dajax / Dajaxice没有很好的记录...我只需要显示一些图像。

2 个答案:

答案 0 :(得分:10)

这是如何使用Dajax / Dajaxice来实现的,这是为了让Django中的AJAX变得简单:

  1. 根据文档安装DajaxiceDajax。文档似乎没有提及它,但您也可以使用pip,即

    pip install django-dajaxice
    pip install django-dajax
    

    获取库。在任何情况下,请确保按照doc说明安装Django应用程序并将必要的Javascript库加载到gallery.html。 (注意,您需要为Dajax安装jQuery或类似的JS框架才能工作。)

  2. gallery.html中,将itemscategories呈现为HTML的部分隔离。将此部分复制到一个名为gallery_content.html的单独的Django模板中,然后将gallery.html中的部分替换为带有特定ID的空白<div>,例如

    <div id="gallery-content"></div>
    

    您正在做的是创建#gallery-content作为HTML的占位符,稍后将通过Dajaxice调用为每个页面生成。

  3. 现在,在gallery.html的其他地方,为用户创建一种方式告诉您要转到哪个页面,例如

    <input id="page-number">
    <button onclick="Dajaxice.myapp.gallerypages_content(Dajax.process, {'page': document.getElementById('page-number').value})">Go to page</button>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
    

    Javascript onclick代码 - 每当用户点击按钮元素时调用 - 都会做两件事:(1)抓取#page-number输入元素的值,以及(2)通过gallerypages_content Javascript调用异步地将它发送到Django Dajaxice.myapp.gallerypages_content视图,即没有正常的Web浏览器页面加载。请注意,myapp应替换为Django应用程序的名称。

  4. 最后,您需要创建gallerypages_content视图 - 这是现有gallerypages视图的变体,已修改为与Dajaxice / Dajax一起使用。 Dajaxice是硬编码的,可以在ajax.py中查找此类视图,因此请在ajax.py文件夹中创建myapp,如下所示:

    from django.template.loader import render_to_string
    from dajax.core import Dajax
    from dajaxice.decorators import dajaxice_register
    
    @dajaxice_register
    def gallerypages_content(request, page):
    
        page = int(page)
    
        # ... code to calculate itemsList and categories as before ...
    
        html = render_to_string('gallery_content.html',
                                {'items': itemsList,'categories': categories,}, 
                                context_instance = RequestContext(request))
        dajax = Dajax()
        dajax.assign('#gallery-content', 'innerHTML', html)
        return dajax.json()
    

    这就是上面的代码:(1)将page参数(现在是一个字符串(即#page-number输入元素的原始字符串值))转换为Python整数; (2)进行与以前相同的计算以获得itemsListcategories; (3)使用render_to_stringgallery_content.html呈现为HTML字符串而不是正常的Django HTTP响应; (4)使用Dajax API创建一条指令,将HTML注入#gallery-content div; (5)并且,作为视图的响应,以JSON格式返回这些指令。 onclick处理程序中的Dajaxice调用实际上会接收这些指令并对它们采取行动(严格来说,这是执行此操作的Dajax.process回调),导致HTML显示。请注意,您需要使用gallerypages_content修饰@dajaxice_register - 这有助于Dajaxice将所有内容挂钩。

  5. 我没有特别测试过这个,但它是基于我如何让Dajaxice / Dajax为我工作,我希望它适合你 - 或者至少让你开始!

答案 1 :(得分:1)

  

我应该使用django-dajax还是django-dajaxice?

     

总之,不,我在4年前创建了这些项目作为一个很酷的工具   为了解决我当时遇到的一个具体问题。

     

现在使用这些项目是一个坏主意。

https://github.com/jorgebastida/django-dajax/