从2021年9月2日发文至今,Python系列(包括代码在内)共计114020个字、五十七篇!
今天是2022年的2月16日,新年结束咯!
网页的分页显示
blog/views.py:
# (十四、Admin后台管理)
from django.views import View
from .models import BlogModel
from django.http import HttpResponse
from django.shortcuts import render,redirect,reverse # 重定向需导入模块
from django.contrib.auth.decorators import permission_required # (十三、Auth权限认证)
# 给用户添加权限
from django.contrib.auth.models import User,Group,Permission # (十三、Auth权限认证)
# 方法装饰器
from django.utils.decorators import method_decorator # (十三、Auth权限认证)
from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage
def index(request):
return render(request,'blog/blog_index.html')
# 这样的话只有被设置拥有此权限的用户才可访问此视图函数对应的前端页面(注意:如果是超级用户则拥有所有权限的)。哪怕你登录了普通用户会发现也访问失败
# ,它会自动给你跳转到你settings.py文件中设置的权限不足而跳转到的页面里!(十三、Auth权限认证)
# 设置权限,appname.codename(权限名称)
@permission_required('blog.add_blogmodel')
def blog_add(request):
# 如果是get请求,那就是访问页面
if request.method == 'GET':
return render(request,'blog/blog_add.html')
# 如果是post请求,那就是向页面提交数据
elif request.method == 'POST':
# 获取文章标题
title = request.POST.get('title') # 这里的title需要和前端页面blog_add里的标题input中的name值保持一致.
# 获取文章内容
content = request.POST.get('content') # 这里的content需要和前端页面blog_add里的内容input中的name值保持一致.
# 将数据保存到数据库中
BlogModel.objects.get_or_create(title=title,content=content)
b_list = BlogModel.objects.all() # 查询所有文章
# 文章添加成功后,要转到文章列表页,展示所有文章.
return render(request,'blog/blog_list.html',context={'b_list':b_list})
def blog_list(request):
b_list = BlogModel.objects.all() # 查询所有文章
pg = Paginator(b_list, 3)
try:
pg_current = request.GET.get('page') # 获取当前的页码
pages = pg.page(pg_current) # 获取当前页面数据
# 如果页面值page不是整数,默认显示第一页
except PageNotAnInteger:
pages = pg.page(1)
# 如果页面值有效但没有数据,默认显示最后一页
except EmptyPage:
pages = pg.page(pg.num_pages)
return render(request,'blog/blog_list.html', context={'pages': pages})
# 通过blog_id确定具体查看的是哪篇文章。
def blog_detail(request,blog_id):
blog = BlogModel.objects.get(id=blog_id)
return render(request,'blog/blog_detail.html',context={'blog':blog})
# 通过blog_id确定具体需要删除的是哪篇文章
def blog_delete(request,blog_id):
blog = BlogModel.objects.filter(id=blog_id)
# 如果有当前这篇文章就删除
if blog:
blog.delete()
return redirect(reverse('blog_list')) # 'blog_list'即需要重定向的路由name值.
else:
return HttpResponse('该文章不存在')
# 使用类视图,可以不需要get和post判断
class Blog_update(View):
def get(self,request,blog_id):
blog = BlogModel.objects.get(id=blog_id)
return render(request,'blog/blog_edit.html',context={'blog':blog})
# 在类视图里设置拥有此权限的用户才可访问此视图函数对应的前端页面,需要加method_decorator()
@method_decorator(permission_required('blog.change_blogmodel'))
def post(self,request,blog_id):
# 获取文章标题
new_title = request.POST.get('new_title') # 这里的new_title需要和前端页面blog_edit里的标题input中的name值保持一致.
# 获取文章内容
new_content = request.POST.get('new_content') # 这里的new_content需要和前端页面blog_edit里的内容input中的name值保持一致.
BlogModel.objects.filter(id=blog_id).update(title=new_title,content=new_content) # 这里的红变量名是数据库中的字段名称
# 文章修改成功后,要转到文章列表页,展示所有文章.
return redirect(reverse('blog_list'))
# 添加权限
def permission_add(request):
user = User.objects.filter(username='chen').first() # 获取要添加权限的用户
# per = Permission.objects.filter(codename='add_blogmodel').first() # 获取用户要添加的权限
per = Permission.objects.filter(codename='change_blogmodel').first() # 获取用户要修改的权限
user.user_permissions.add(per) # 正向访问,通过外键给用户添加权限
return HttpResponse('用户权限添加成功!')
# 分页
def page_test(request):
data = ['摸鱼','林枫','阅人间','x','you','晨']
# 实例化分页对象
pg = Paginator(data, 2)
# print(pg) # outputs:<django.core.paginator.Paginator object at 0x7fadd078c6a0>
# print(pg.count) # 总共分页的数据量:6
# print(pg.num_pages) # 总页数:3
# print(pg.page_range) # 页码范围,从1开始:range(1,4)
# print(pg.per_page) # 每页展示的数据量:2
pg1 = pg.page(1) # 参数是页码
pg2 = pg.page(2) # 参数是页码
print(pg1.object_list) # 展示第一页所有的数据对象
print(pg2.object_list) # 展示第一页所有的数据对象
print(pg1.number) # 获取当前页码数
print(pg2.number) # 获取当前页码数
# 方法
print(pg1.has_next()) # 判断当前页有没有下一页
print(pg1.has_previous()) # 判断当前有没有上一页
print(pg1.has_other_pages()) # 判断当前页有没有上一页或者下一页
print(pg1.next_page_number()) # 获取下一页的页码,没有下一页的话会报错
print(pg2.previous_page_number()) # 获取上一页的页码,没有上一页的话会报错
print(pg1.start_index()) # 获取当前页面第一个对象的索引值,从1开始
print(pg2.end_index()) # 获取当前页面最后一个对象的索引值
return HttpResponse('显示完毕!')
templates/blog/blog_list.html:
{#(十四、Admin后台管理)#}
{% extends 'blog/blog_base.html' %}
{% block title %}
博客显示
{% endblock %}
{% block body %}
<h1>靓文展示页</h1>
<table>
<tr>
<th width="80px">标题</th>
<th>功能</th>
</tr>
{% for b in pages %}
<tr>
<td style="text-align: center"><a href="{% url 'blog_detail' b.id %}">{{ b.title }}</a></td>
<td><a href="{% url 'cls_update' b.id %}">编辑</a> <a href="{% url 'blog_delete' b.id %}">删除</a></td> {# (十、cookie与session:类视图) #}
</tr>
{% endfor %}
</table>
{# 判断当前页面是否有上一页 #}
{% if pages.has_previous %}
<a href="{% url 'blog_list' %}?page={{ pages.previous_page_number }}">上一页</a>
{% endif %}
{# 点击页码去到对应页面 #}
{% for num in pages.paginator.page_range %}
{% if num == pages.number %}
<a href="{% url 'blog_list' %}?page={{ num }}" style="background-color: cornflowerblue">{{ num }}</a>
{% else %}
<a href="{% url 'blog_list' %}?page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}
{# 判断当前页面是否有下一页 #}
{% if pages.has_next %}
<a href="{% url 'blog_list' %}?page={{ pages.next_page_number }}">下一页</a>
{% endif %}
<br>
<a href="{% url 'blog_index' %}">返回首页</a>
{% endblock %}
blog/urls.py:
# (十四、Admin后台管理)
from django.urls import path
from . import views
urlpatterns = [
path('index/',views.index,name='blog_index'),
path('add/',views.blog_add,name='blog_add'),
path('list/',views.blog_list,name='blog_list'),
path('detail/<blog_id>/',views.blog_detail,name='blog_detail'),
path('delete/<blog_id>/',views.blog_delete,name='blog_delete'),
path('cls_update/<blog_id>/',views.Blog_update.as_view(),name='cls_update'), # 只要是使用类视图,就需要调用as_view()这个方法
path('permission_add/',views.permission_add,name='permission_add'),
path('page_test/',views.page_test),
]
![](https://img.haomeiwen.com/i26973252/e0101951dea9aaae.png)
![](https://img.haomeiwen.com/i26973252/4c3528e995c8b818.png)
![](https://img.haomeiwen.com/i26973252/43217695758959c1.png)
![](https://img.haomeiwen.com/i26973252/d49fb4b1bf6d4ac6.png)
文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!
Editor:Lonelyroots
网友评论