小编典典

Django和Ajax-我该怎么办?

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

Dajax / Dajaxice的记录不是很好…我只需要显示一些图像即可。


阅读 214

收藏
2020-07-26

共1个答案

小编典典

这是使用Dajax / Dajaxice的方法,这是为了在Django中简化AJAX:

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

    pip install django-dajax

获取库。无论如何,请确保遵循doc说明安装Django应用,并将必需的Javascript库加载到中gallery.html。(请注意,您需要安装jQuery或类似的JS框架才能使Dajax正常工作。)

  1. 在中gallery.html,将itemscategories呈现为HTML 的部分隔离。将此部分复制到一个单独的Django模板中,例如,gallery_content.html然后用特定ID gallery.html的空白替换该部分<div>,例如
    <div id="gallery-content"></div>
    

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

  1. 现在,在中的其他位置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异步将其发送到Django
视图,即没有正常的网络通过Dajaxice.myapp.gallerypages_contentJavascript调用加载浏览器页面。请注意,myapp应将其替换为Django应用的名称。

  1. 最后,您需要创建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.html为HTML字符串,而不是普通的Django
HTTP响应;(4)使用Dajax API创建指令以将HTML注入#gallery- contentdiv;(5)作为视图的响应,并以JSON格式返回这些指令。onclick处理程序中的Dajaxice调用实际上将接收这些指令并对其执行操作(严格来说,是由Dajax.process回调执行此操作),从而导致HTML出现。请注意,您需要gallerypages_content使用@dajaxice_register
-有助于Dajaxice将所有内容挂钩。

我还没有具体测试过任何一项,但这是基于我如何让Dajaxice / Dajax为我工作,我希望它对您有用-至少可以让您入门!

2020-07-26