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
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验证
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>