Django和Ajax - 我该怎么办?

moe*_*nad 1 django ajax

我几乎完成了我的网站,除了最后一部分,我需要使画廊页面支持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))
Run Code Online (Sandbox Code Playgroud)

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

Gho*_*r21 10

以下是如何使用Dajax/Dajaxice来实现它,这意味着在Django中使AJAX更容易:

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

    pip install django-dajaxice
    pip install django-dajax
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    <div id="gallery-content"></div>
    
    Run Code Online (Sandbox Code Playgroud)

    您正在做的是创建#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>??????????????????????????????????????????????????
    
    Run Code Online (Sandbox Code Playgroud)

    Javascript onclick代码 - 每当用户点击按钮元素时调用 - 都会做两件事:(1)抓取#page-numberinput元素的值,(2)gallerypages_content异步地将它发送到Django 视图,即没有普通的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()
    
    Run Code Online (Sandbox Code Playgroud)

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

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