(一)数据分页 

可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/

模板:如果只要显示 1、2、3、4、5、6.。。。的话,在模板中加上 第8、9、10行就行了

 <span class="step-links">
{# 如果有上一页,返回true #}
{% if posts.has_previous %}
<a href="?page=1">&laquo;首页 </a>
<a href="/blog/?page={{ posts.previous_page_number }}">上一页</a>
{% endif %}</span>
{# posts.paginator.page_range 返回页码可迭代范围 ,例如有5页,这时候和range(1,5)是一样的。[1,2,3,4] #}
{% for post_num in posts.paginator.page_range %}
<a href="/blog/?page={{ post_num }}">{{ post_num }}</a>
{% endfor %}
<span class="current">
{# 如果有下一页,返回true#}
{% if posts.has_next %}
<a href="/blog/?page={{ posts.next_page_number }}">下一页</a>
<a href="/blog/?page={{ posts.paginator.num_pages }}">尾页 &raquo;</a>
{% endif %}
</span>
<span class="current">
Page {{ posts.number }} of {{ posts.paginator.num_pages }}
</span>

视图函数(views.py):

 from blog.models import BlogPost
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #获取博客信息并渲染到页面上
def archive(request):
#获取 BlogPost的所有数据并按timestamp倒序排序,timestamp相同则根据title排序
all_posts = BlogPost.objects.all().order_by('-timestamp','title')
#实例化Paginator,限制每页显示10条数据
paginator = Paginator(all_posts, 10)
#获取用户选择的页码
page = request.GET.get('page')
try:
posts = paginator.page(page)#获取page页的数据
except PageNotAnInteger:#页码不为整数则获取第一页数据
posts = paginator.page(1)
except EmptyPage:#超出最大页码则获取最后一页的数据
posts = paginator.page(paginator.num_pages)
#return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))
return render(request,'archive.html',{'posts': posts,})

(二)跨站点请求伪造(Cross-Site Request Forgery,CSRF)

不允许POST、PUT和DELATE等不安全的请求方式通过跨站点请求伪造来进行攻击可以参考https://docs.djangoproject.com/en/2.0/ref/csrf/

1、项目文件下的settings.py 的MIDDLEWARE 列表的'django.middleware.csrf.CsrfViewMiddleware', 没有被注释 (django 2.0.5是默认启用的)

2、模板文件的<form>标签后面增加{% csrf_token %},例如:第一行最后面的那个就是了

 <form action="/blog/create/" method="post">{% csrf_token %}
<table>{{ form }}</table><br>
<input type=submit>
</form>

3、请求类型修改为 RequestContext

 from django.shortcuts import render,render_to_response
from blog.models import BlogPost,BlogPostForm
from django.template import RequestContext #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))

django 文档说明的一种方式应该就是上面这种写法render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request)),不过我试了下是没什么用,后面换render函数可以了(render函数请求类型就是RequestContext ,所以不用另外指定了)

from django.shortcuts import render
from blog.models import BlogPost,BlogPostForm #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render(request,'archive.html',{'posts': posts,'form':BlogPostForm})

最新文章

  1. hibernate的get和load的区别
  2. 在编辑模式中一个ASP.NET应用详细视图显示集合属性 编辑模式和只读模式
  3. Divisibility by Eight (数学)
  4. Eclipse的java代码出错:The import org.apache cannot be resolved
  5. 第一个android程序所遇到问题
  6. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库
  7. 数据挖掘-关联规则分析[ZZ]
  8. jquery优化引发的思考
  9. lzo压缩格式文件查看
  10. jni开发中的常见错误
  11. MVC支付宝PC网站接口对接
  12. B507实验室打印机连接方法
  13. 如何抽象一个 Vue 公共组件
  14. Android异步消息机制
  15. openstack操作之二 restful api
  16. 前端可视化项目流程,涉及three.js(webGL),3DMax技术,持续更新
  17. 最新工控\建模仿真\组态\监控集成开发平台源码解决方案2019 ---所有VC++源码100%提供!
  18. CodeForces - 455C Civilization (dfs+并查集)
  19. xmlhttp.readyState的值及解释:
  20. JDK8 - Function介绍

热门文章

  1. Android在代码中获取应用签名
  2. docker OCI runtime
  3. TiDB 部署及数据同步
  4. Visual Studio自带的的Developer Command Prompt对话框
  5. OopMap介绍
  6. CRM项目分析建表
  7. ffplay源码分析7-播放控制
  8. laravel 标签
  9. RadioButtonList根据值触发OnSelectedIndexChanged事件
  10. office online server部署和简单操作