Django Paginator分页组件

Paginator分页组件

python 复制代码
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

python 复制代码
Paginator(object_list)
# 创建分页对象

分页对象内置属性

python 复制代码
all_ = models.objects.all()
p = Paginator(all_, 10)
# 分页all_数据,每页显示10条数据
python 复制代码
p.count # 总数据量
p.num_pages() # 分页数
p.page_range() # 列表形式返回当前可有的页数 [1,2,3]
python 复制代码
page_1 = p.page(1) # 选择第一页,返回第一页数据对象
page_1.object_list # 返回第一页所有数据
for var in page_1:
    print(var)
A
B
C
...

某一页内置属性

python 复制代码
page_1.number # 当前页的页码
page_1.has_next() # 是否有下一页
page_1.has_previous() # 是否有上一页
page_1.has_other_pages() # 是否含有其他页
python 复制代码
page_1.next_page_number() # 下一页的页码
page_1.previous_page_number() # 上一页的页码
python 复制代码
page_1.start_index() # 该页第一个数据的索引
page_1.end_index() # 该页最后一个数据的索引
  • EmptyPage:取不到页面数据,抛出该异常

    python 复制代码
    all_ = models.objects.all()
    p = Paginator(all_, 10)
    try:
        list_ = p.page(page_num)
    except EmptyPage:
    	#没有第page_num页
        list_ = paginator.page(1) # 取不到该也数据,直接返回第一页数据
  • PageNotAnInteger:当页数是一个非整数类型时,抛出该异常

模板页面基本使用方式

jinja2 复制代码
{% if topic_list.has_previous %}
	<!-- 当前页是否含有上一页 -->
	<a href="?page={{ list_.previous_page_number }}">上一页</a>
	<!-- 连接传参形式传递上一页的页码ID -->
{% endif %}

{% if topic_list.has_next %}
	<!-- 当前页是否含有下一页 -->
    <a href="?page={{ list_.next_page_number }}">下一页</a>
    <!-- 连接传参形式传递下一页的页码ID -->
{% endif %}

邮件系统

django中内置了许多方法可以使开发者方便的进行邮件发送

邮件配置

发送邮件,首先需要在项目的settings.py文件下配置邮件服务器连接等信息

python 复制代码
EMAIL_USE_SSL = True # Secure Sockets Layer 安全套接层, 取决于邮件服务器是否开启加密协议
EMAIL_HOST = 'smtp.qq.com'  # 邮件服务器地址
EMAIL_PORT = 465 # 邮件服务器端口 
EMAIL_HOST_USER = '[email protected]' # 登陆邮件服务器的账号
EMAIL_HOST_PASSWORD = 'password'  # 登陆邮件服务器的密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 邮件的发送者
  • 注意EMAIL_HOST_PASSWORD所设置的登陆邮件服务器的密码为邮件客户端后台所设置的第三方客户端登陆密码,这个值并不是直接账号密码

如:QQ邮箱的该值密码在网页版QQ邮件客户端的设置->账户->开启POP3/SMTP服务|IMAP/SMTP服务

发送文本邮件

发送普通邮件可以使用django.core.mail模块下的send_mail函数进行

python 复制代码
send_mail(subject, message, from_email, recipient_list, fail_silently=False, html_message=None)
# 将邮件发送至`recipient_list`中的每一个收件人处
'''
subject: 发送邮件标题
message: 发送邮件正文
from_email: 发件人邮箱地址
recipient_list: 一个字符串列表,每一个数据为接收者的邮箱地址
html_message: 如果指定该值,则发送的内容类型为text/html为一个html邮件内容
''
  • 发送普通邮件视图函数
python 复制代码
from django.core.mail import send_mail
def send_email(request):
    subject = '邮件测试'
    message = '<a href="http://www.python.org">学习Python,我很快乐</a>'
    send_mail(
        subject = subject,
        message = message,
        from_email = '[email protected]',
        recipient_list = ['[email protected]','[email protected]']
    )
    return HttpResponse('Down')

发送HTML邮件

这里发送的邮件内容为一个HTMLa标签,但是真正接收者接到该邮件时,a标签并不会解释称为真正的a标签,只是一个普通的字符串,这是因为当前发送邮件的类型为text/plain,可以使用html_message参数进行HTML内容的发送

python 复制代码
from django.core.mail import send_mail
def send_email(request):    
    subject = '邮件测试'
    message = '<a href="http://www.python.org">学习Python,我很快乐</a>'
    send_mail(
        subject = subject,
        message = '', # 该参数为必须参数,必须填写
        html_message = message,
        from_email = '[email protected]',
        recipient_list =['[email protected]','[email protected]']
    )
    return HttpResponse('Down')

发送html格式邮件还可以使用django.core.mail模块下的EmailMultiAlternatives类进行邮件体的构造,然后进行邮件发送

python 复制代码
EmailMultiAlternatives(subject='', body='', from_email=None, to=None)
'''
subject: 邮件标题
body: 邮件内容
from_email: 邮件发送者
to: 邮件接收人列表
'''
python 复制代码
EmailMultiAlternatives.attach_alternative(content, mimetype)
# 向EmailMultiAlternatives实例中添加mimetype支持的邮件内容
'''
content: 添加的邮件内容
mimetype: 添加内容的mime类型
''
python 复制代码
EmailMultiAlternatives.send()
# 发送邮件
  • 一个demo
python 复制代码
from django.core.mail import EmailMultiAlternatives
def send_email(request):
    subject = '邮件测试'
    text_message = '学习Python,我很快乐'
    html_message = '<a href="http://www.python.org">学习Python,我很快乐</a>'
    email = EmailMultiAlternatives(
        subject = subject,
        body = text_message,
        from_email = '[email protected]',
        to = ['[email protected]','[email protected]']
    )
    email.attach_alternative(html_message,'text/html') # 添加HTML邮件部分
    email.send() # 发送邮件
    return HttpResponse('Down')

发送富文本邮件

经常需要我们在邮件中加入图片等静态资源

需要用到pythonemail.mime.image模块下的MIMEImage类进行图片内容的构造

这里发送邮件使用EmailMessage类,来自于django.core.mail模块下;再使用对应该类实例的attach添加图片资源数据,最后使用实例的send函数发送邮件

python 复制代码
EmailMessage(subject='', body='', from_email=None, to=None)
'''
subject: 邮件标题
body: 邮件内容
from_email: 邮件发送者
to: 邮件接收人列表
'''
  • 又是一个demo
python 复制代码
from sendmailpro.settings import STATICFILES_DIRS
import os
from email.mime.image import MIMEImage
from django.core.mail import EmailMessage
def send_email(request):
    subject = '图片邮件测试'
    file_1 = os.path.join(STATICFILES_DIRS[0],'img/1.png')
    with open(file_1, 'rb') as fp: 
        # 打开第一张图片
        image_1 = MIMEImage(fp.read())
        
    file_2 = os.path.join(STATICFILES_DIRS[0],'img/2.png')
    with open(file_2, 'rb') as fp: 
        # 打开第二张图片
        image_2 = MIMEImage(fp.read())
        
    body = "<img src='cid:first_id'><br><img src='cid:sec_id'>"
    # 发送邮件主体内容
    
	image_1.add_header('Content-ID','<%s>' % 'first_id') 
    # 通过 CID 对称图片在邮件内容中的位置
    image_2.add_header('Content-ID','<%s>' % 'sec_id')
    
    message = EmailMessage( # 构建发送的邮件主体
                subject=subject,
                body=body,
                from_email='[email protected]',
                to=['[email protected]','[email protected]']
            )
    message.content_subtype = 'html'
    message.attach(image_1) # 添加两张图片
    message.attach(image_2)
    message.send() # 发送邮件
    return HttpResponse('Down')

发送附件邮件

发送附件,可以使用django.core.mail模块下的EmailMessage类进行附件邮件体构造

通过EmailMessage实例的attach|attach_file两种函数在邮件主体中添加附件内容

attach_file添加邮件附件直接加入路径即可,但是attach添加附件内容需要提供附件内容

python 复制代码
attach(filename=None, content=None, mimetype=None)
# 添加附件内容
'''
filename: 附件文件名称
content: 附件内容
mimetype: 附件的`MIME`类型
'''
python 复制代码
attach_file(path, mimetype=None)
# 直接通过路径添加附件
'''
path: 附件路径
mimetype: 附件的MIME类型
'''
  • 一个demo
python 复制代码
from sendmailpro.settings import STATICFILES_DIRS
import os
from email.mime.image import MIMEImage
from django.core.mail import EmailMessage
def send_email(request):
    subject = '附件邮件测试'
    email = EmailMessage(
        subject=subject,
        body='这是一封具有图片附件的邮件',
        from_email='[email protected]',
        to=['[email protected]','[email protected]']
    )
    file_1 = os.path.join(STATICFILES_DIRS[0],'img/1.png')
    image_1 = open(file_1,'rb').read()
    email.attach('1.png',image_1,'image/png') # 使用attach实例函数添加附件内容

    file_2 = os.path.join(STATICFILES_DIRS[0],'img/2.png')
    email.attach_file(file_2,mimetype='image/png') # 使用attach_file实例函数添加附件路径

    email.send()
    return HttpResponse('Down')
相关推荐
blues_C3 小时前
十三、【核心功能篇】测试计划管理:组织和编排测试用例
vue.js·django·测试用例·drf·测试平台
恸流失12 小时前
DJango项目
后端·python·django
编程大全20 小时前
41道Django高频题整理(附答案背诵版)
数据库·django·sqlite
网安小张1 天前
解锁FastAPI与MongoDB聚合管道的性能奥秘
数据库·python·django
KENYCHEN奉孝1 天前
Pandas和Django的示例Demo
python·django·pandas
老胖闲聊1 天前
Python Django完整教程与代码示例
数据库·python·django
noravinsc1 天前
django paramiko 跳转登录
后端·python·django
践行见远1 天前
django之请求处理过程分析
数据库·django·sqlite
声声codeGrandMaster1 天前
Django之表格上传
后端·python·django
菌菌的快乐生活1 天前
网站静态文件加速-Django项目静态文件存储到腾讯云COS存储提升网络请求速度
django·cos存储