我几乎已经完成了我的网站,除了最后一部分,我需要让图库页面支持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没有很好的记录...我只需要显示一些图像。
答案 0 :(得分:10)
这是如何使用Dajax / Dajaxice来实现的,这是为了让Django中的AJAX变得简单:
根据文档安装Dajaxice和Dajax。文档似乎没有提及它,但您也可以使用pip
,即
pip install django-dajaxice
pip install django-dajax
获取库。在任何情况下,请确保按照doc说明安装Django应用程序并将必要的Javascript库加载到gallery.html
。 (注意,您需要为Dajax安装jQuery或类似的JS框架才能工作。)
在gallery.html
中,将items
和categories
呈现为HTML的部分隔离。将此部分复制到一个名为gallery_content.html
的单独的Django模板中,然后将gallery.html
中的部分替换为带有特定ID的空白<div>
,例如
<div id="gallery-content"></div>
您正在做的是创建#gallery-content
作为HTML的占位符,稍后将通过Dajaxice调用为每个页面生成。
现在,在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应用程序的名称。
最后,您需要创建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)进行与以前相同的计算以获得itemsList
和categories
; (3)使用render_to_string
将gallery_content.html
呈现为HTML字符串而不是正常的Django HTTP响应; (4)使用Dajax API创建一条指令,将HTML注入#gallery-content
div; (5)并且,作为视图的响应,以JSON格式返回这些指令。 onclick
处理程序中的Dajaxice调用实际上会接收这些指令并对它们采取行动(严格来说,这是执行此操作的Dajax.process
回调),导致HTML显示。请注意,您需要使用gallerypages_content
修饰@dajaxice_register
- 这有助于Dajaxice将所有内容挂钩。
我没有特别测试过这个,但它是基于我如何让Dajaxice / Dajax为我工作,我希望它适合你 - 或者至少让你开始!
答案 1 :(得分:1)
我应该使用django-dajax还是django-dajaxice?
总之,不,我在4年前创建了这些项目作为一个很酷的工具 为了解决我当时遇到的一个具体问题。
现在使用这些项目是一个坏主意。