1

我几乎完成了我的网站,除了最后一部分我需要让画廊页面支持 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 没有很好的文档记录......我只需要展示一些图像。

4

2 回答 2

10

以下是使用 Dajax/Dajaxice 的方法,旨在简化 Django 中的 AJAX:

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

    pip install django-dajaxice
    pip install django-dajax
    

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

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

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

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

  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>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
    

    Javascriptonclick代码——每当用户点击按钮元素时被调用——做两件事:(1) 获取#page-number输入元素的值,(2) 将它异步发送到 Djangogallerypages_content视图,即没有正常的 web浏览器页面加载,通过Dajaxice.myapp.gallerypages_contentJavascript 调用。请注意,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_string呈现gallery_content.htmlHTML 字符串而不是正常的 Django HTTP 响应;(4)使用Dajax API创建指令将HTML注入到#gallery-contentdiv中;(5) 并且,作为视图的响应,以 JSON 格式返回这些指令。处理程序中的 Dajaxice 调用onclick实际上将接收这些指令并对其采取行动(严格来说,这是Dajax.process执行此操作的回调),从而导致 HTML 显示出来。请注意,您需要gallerypages_content@dajaxice_register-- 这有助于 Dajaxice 将所有内容连接在一起。

我没有专门测试过这些,但它是基于我如何让 Dajaxice/Dajax 为我工作的,我希望它对你有用——或者至少让你开始!

于 2012-07-30T04:07:07.317 回答
1

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

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

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

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

于 2015-03-06T15:25:07.603 回答