Django----之排序分页和forms认证

django排序

all_articles= ArticleInfo.objects.all()
#在django内部form模型查询集上可以支持排序和切片,但是切片不能是负索引
排序并取出前六:click_sort = all_articles.order_by('-click_num'(类中的字段))[:6]

django按时间分类

data_time = all_articles.datetimes('add_time','month(分类标准)',order='DESC(排序)')
网页显示模板语言:{{ date.year }}年{{ date.month }}月
验证登陆可以使用装饰器:

from django.contrib.auth.decorators import login_required

在views中引入分页器类

from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage实例化类pa = Paginator(分页对象(列表),每页的数量) pa是被分完页的整体pages = pa.page(1)取第一页数据给pages,使用时要传参pagenum

{% if pages.has_previous %}判断是否有下一页。{% if pages.has_next %}是否有下一页
<a href="{% url 'index' %}?pagenum={{pages.previous_page_number}}">获取下一页页码
{ pages.number }}/{{ pages.paginator.num_pages }}当前页/总页数

django排序

all_articles= ArticleInfo.objects.all()
#在django内部orm模型查询集上可以支持排序和切片,但是切片不能是负索引
排序并取出前六:click_sort = all_articles.order_by('-click_num'(类中的字段))[:6]

django按时间分类

data_time = all_articles.datetimes('add_time','month(分类标准)',order='DESC(排序)')
网页显示模板语言:{{ date.year }}年{{ date.month }}月
验证登陆可以使用装饰器:

from django.contrib.auth.decorators import login_required

from django.shortcuts import render
from .models import OrgInfo,TeacherInfo,CityInfo
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
# Create your views here.
def org_list(request):
    #拿到所有的数据
    all_orgs = OrgInfo.objects.all()
    all_citys = CityInfo.objects.all()
    #获取机构的排序
    sort_orgs = all_orgs.order_by('-add_time')[:3]
    #根据类别过滤
    cat = request.GET.get('cat','')
    if cat:
        all_orgs = all_orgs.filter(category=cat)
    #根据城市过滤
    cityid = request.GET.get('cityid','')
    if cityid:
        all_orgs = all_orgs.filter(cityinfo_id = int(cityid))
    #排序
    sort = request.GET.get('sort','')
    if sort == 'studynum':
        all_orgs = all_orgs.order_by('-study_num')
    if sort == 'coursenum':
        all_orgs = all_orgs.order_by('-course_num')
    pagenum = request.GET.get('pagenum',1)
    pa = Paginator(all_orgs,2)
    try:
        page_list = pa.page(pagenum)
    except PageNotAnInteger:
        page_list = pa.page(1)
    except EmptyPage:
        page_list = pa.page(pa.num_pages)
    return render(request,'orgs/org-list.html',{
        'all_orgs':all_orgs,
        'all_citys':all_citys,
        'page_list':page_list,
        'cat':cat,
        'cityid':cityid,
        'sort':sort,
        'sort_orgs':sort_orgs
    })

前端继承模板语言

{% extends 'base.html' %}
{% load staticfiles %}
{% block title %}课程机构列表 - 尚在线网{% endblock %}

分页前端模板语言   {% if pages.has_previous %}判断是否有下一页。{% if pages.has_next %}是否有下一页
<a href="{% url 'index' %}?pagenum={{pages.previous_page_number}}">获取下一页页码
{ pages.number }}/{{ pages.paginator.num_pages }}当前页/总页数

{% if page_list.has_previous %}
<li class="long"><a href="?pagenum={{ page_list.previous_page_number }}&cat={{ cat }}&cityid={{ cityid }}&sort={{ sort }}">上一页</a></li>
{% else %}
<li class="long"><a href="?pagenum=1&cat={{ cat }}&cityid={{ cityid }}&sort={{ sort }}">上一页</a></li>
{% endif %}
{% for num in page_list.paginator.page_range %}
 <li {% if num == page_list.number %}class="active"{% endif %}><a href="?pagenum={{ num }}&cat={{ cat }}&cityid={{ cityid }}&sort={{ sort }}">{{ num }}</a></li>
 {% endfor %}
{% if page_list.has_next %}
<li class="long"><a href="?pagenum={{ page_list.next_page_number }}&cat={{ cat }}&cityid={{ cityid }}&sort={{ sort }}">下一页</a></li>
 {% else %}
<li class="long"><a href="?pagenum={{ page_list.paginator.num_pages }}&cat={{ cat }}&cityid={{ cityid }}&sort={{ sort }}">下一页</a></li>
 {% endif %}

Paginator对象

  • Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数

属性

  • count:对象总数
  • num_pages:页面总数
  • page_range:页码列表,从1开始,例如[1, 2, 3, 4]

方法

  • page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常

异常exception

  • InvalidPage:当向page()传入一个无效的页码时抛出
  • PageNotAnInteger:当向page()传入一个不是整数的值时抛出
  • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出

Page对象

创建对象

  • Paginator对象的page()方法返回Page对象,不需要手动构造

属性

  • object_list:当前页上所有对象的列表
  • number:当前页的序号,从1开始
  • paginator:当前page对象相关的Paginator对象

方法

  • has_next():如果有下一页返回True
  • has_previous():如果有上一页返回True
  • has_other_pages():如果有上一页或下一页返回True
  • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
  • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
  • len():返回当前页面对象的个数
  • 迭代页面对象:访问当前页面中的每个对象

用户模块扩展已经存在的模型

1)、onetoone扩展

2)、使用内部auth继承构建自己的用户表

第一步:创建模型类继承于内部user表的可继承类

from django.db import models
from django.contrib.auth.models import AbstractUser,User
from datetime import datetime
# Create your models here.

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=20,verbose_name="用户昵称",null=True,blank=True)
    url = models.URLField(max_length=100,verbose_name="用户主页",null=True,blank=True)
    add_time = models.DateTimeField(default=datetime.now,verbose_name="添加时间")

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name

第二步:需要在settings当中指定默认的用户表为我们自己创建的这个表

AUTH_USER_MODEL = 'users.UserProfile'

django forms验证

form表单上传要加enctype

<form action="" method="post" enctype="multipart/form-data">
 图片文件在request的FILES中储蓄的为文件二进制内容:artimg=request.FILES.get()
name='artivle/'+artimg.name为图片的名字往数据库存要加地址
写入文件可以用with不用关闭流: 
with open(file_name,'wb') as f:
    for c in artimage.chunks():  chunks()将二进制文件变成可迭代的

中间键就是类里面有五个方法按顺序执行中间键口子轻量级底层插件系统

中间键可以做反扒虫,做流量统计,做ip黑名单,看ip访问频率放到一个列表中,
request>中间键口子1>url>口子2>view>(有错误执行)口子3>口子4>respomse或口子5>render
request.META.get('HTTP_USER_AGENT',None)获得浏览器信息。META是头文件信息
请求时顺序执行中间键,返回时是反方向执行。中间键的顺序不能改变
python managy.py runserverse 0.0.0.0:8000可以让其他网址访问

forms 一般有两个作用,(1)它可以直接返回一个form表单,(2)它可以对我们页面上的form表单字段进行验证,只要模板页面上有form表单,那么它在我们的后台肯定对应了一个form类去做验证。

在我们的app当中新建一个python文件,名字叫做forms,以后只要是写的form验证类,我们统一写在这个文件当中。先在forms文件当中写好我们的form表单验证的类,例如,登陆注册各自都有自己对应的form表单验证类,以及验证规则。

from django import forms

class UserRegisterForm(forms.Form):
    username = forms.CharField(max_length=20,min_length=6,required=True)
    email = forms.EmailField(max_length=100,min_length=8)
    url = forms.URLField(max_length=100,min_length=8)
    password = forms.CharField(max_length=20,min_length=8,required=True)
    password1 = forms.CharField(max_length=20,min_length=8,required=True)

class UserLoginForm(forms.Form):
    username = forms.CharField(max_length=20,min_length=6,required=True)
    password = forms.CharField(max_length=20,min_length=8,required=True)

在view视图当中我们就可以通过实例化我们的form类,对我们用户提交的数据进行验证。

form类实例化及验证

def user_register(request):
    if request.method == 'GET':
        return render(request,'reg.html')
    else:
        #实例化form类,用来验证用户提交的数据
       user_register_form =  UserRegisterForm(request.POST)
        #一个判断方法:判断这个form验证是否通过(合法),如果合法返回True,不合法返回False
       if user_register_form.is_valid():
           #如果验证合法,那么会把合法的干净的数据存储在form对象的一个属性cleaned_data
           #当中,这个属性是一个字典,我们可以这样去拿干净的数据
           username = user_register_form.cleaned_data['username']
           email = user_register_form.cleaned_data['email']
           url = user_register_form.cleaned_data['url']
           password = user_register_form.cleaned_data['password']
           password1 = user_register_form.cleaned_data['password1']

           user = UserProfile.objects.filter(username=username)
           if user:
               return render(request,'reg.html',{
                   'msg':'帐号已经存在'
               })
           else:
               if password == password1:
                   a = UserProfile()
                   a.username =username
                   a.email = email
                   a.url = url
                   a.password = password
                   a.set_password(password)
                   a.save()
                   return redirect(reverse('users:user_login'))
               else:
                   return render(request, 'reg.html', {
                       'msg': '密码不一致'
                   })
       else:
           return render(request, 'reg.html', {
                       'user_register_form': user_register_form
                   })


def user_login(request):
    if request.method == 'GET':
        return render(request,'login.html')
    else:
        user_login_form = UserLoginForm(request.POST)
        if user_login_form.is_valid():
            username = user_login_form.cleaned_data['username']
            password = user_login_form.cleaned_data['password']

            user = authenticate(username = username,password = password)
            if user:
                login(request,user)
                return redirect(reverse('index'))
            else:
                return render(request,'login.html',{
                    'msg':'用户名或者密码错误'
                })
        else:
            return render(request, 'login.html', {
                'user_login_form': user_login_form

显示错误消息

表单如果验证失败,那么会有一些错误消息,这些消息会存储在form对象当中的一个errors属性当中,这个属性也是一个字典,我们可以通过遍历这个字典,拿到我们想要的错误消息

<div>
    {{ msg }}
    {% for key,err in user_login_form.errors.items %}
        {{ err }}
    {% endfor %}
</div>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值