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')
相关推荐
神奇侠20242 小时前
快速入手-基于Django-rest-framework的serializers序列化器(二)
后端·python·django
神奇侠20244 小时前
快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证(十)
django·simplejwt
唐古乌梁海4 小时前
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
django
WIN赢11 小时前
Spring Boot和Django的区别
spring boot·django·sqlite
神奇侠202411 小时前
快速入手-基于Django-rest-framework的APIView类升级版GenericAPIView(四)
django·genericapiview
星辰大海的精灵11 小时前
Django开发人员最常犯的错误及规避建议
后端·python·django
奔跑草-16 小时前
【服务端】使用conda虚拟环境部署Django项目
python·django·conda
Alfadi联盟 萧瑶21 小时前
Python-Django入手
开发语言·python·django
计算机徐师兄1 天前
Python Django基于人脸识别的票务管理系统(附源码,文档说明)
python·django·人脸识别·票务系统·票务管理系统·票务管理·人脸识别票务系统
暴力袋鼠哥1 天前
基于Django的巴马水晶宫旅游管理系统
python·django·旅游