Django于AJAX choice参数 MTV和MVC模型 Ajax ContentType前后端数据编码格式 自定义分页器

一些简单的数据用这种参数:存的时候是数字,读出来的时候是对应信息.

例如:性别,男女用数字存,取出来用仍用男女.

优点: 节省数据库的空间.

models.py

class User(models.Model):
   name = models.CharField(max_length=32)
   age = models.IntegerField()
   choice = (
      (1, '男'),
      (2, '女'),
  )
   gender = models.IntegerField(choices=choice)
# 测试成绩
import os
import sys

if __name__ == "__main__":
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day57.settings")
   import django
   django.setup()
   from app01 import models

   user_obj = models.User.objects.filter(pk=7).first()

   print(user_obj.gender)  # 显示数据库内容
   print(user_obj.get_gender_display())  # 显示数据库对应值内容

 

Django于AJAX
choice参数
MTV和MVC模型
Ajax
ContentType前后端数据编码格式
自定义分页器

MTV和MVC模型

MTV框架:

django框架自称MTV框架

M: models

T: templates

v: views

MVC框架

M: models

V: views

C: controller 控制urls

Django于AJAX
choice参数
MTV和MVC模型
Ajax
ContentType前后端数据编码格式
自定义分页器

Ajax

Ajax是Javascript语言和服务器经行异步交互,传输的数据是xml.Ajax也可以说是一种方法,基于js开发编程方法

特点: 异步提交,局部刷新,也是Ajax的优点.不需要重新加载整个页面的情况下,可以与服务器交换数据并更新网页部分内容.

同步交互: 客户端发出一个请求后,等待服务端响应结束后,才能经行下一个操作.

异步交互: 客户服端发出一个请求后, 无需等待服务端响应结束,就可以经行下一个操作.

补充:

a标签href   GET请求

浏览器 url  GET请求

form表单  GET/POST请求

Ajax请求  GET/POST请求

Ajax简单应用示例:

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
]

 


views.py

def index(request):
    if request.is_ajax():  # ajax请求
        if request.method == 'POST':  # 做进一步拦截
            i1 = request.POST.get('i1')
            i2 = request.POST.get('i2')
            data = int(i1) + int(i2)
            return HttpResponse(data)
​
    return render(request, 'index.html', locals())

index.html

$('#d1').on('click', function () {
        $.ajax({
            url: '',  // 地址
            type: 'post',  // 方式
​
            data:  {'i1':$('#i1').val(),   // 携带数据
                'i2':$('#i2').val(),
            },
            success: function (data) {         //处理数据, 回调函数
                $('#i3').val(data)
            }
​
​
        })
    })

 

ContentType前后端数据编码格式

前后端编码格式有三种

1, urlencode

2, formdata

3, json

form表单

编码格式是urlencoded.  django都会自动解析并放到request.POST中

使用formdata编码格式传文件时.  django都会放到request.FILES中.

Ajax提交数据

Ajax默认数据提交方式是urlencoded.  所以也在POST中.

Ajax提交json格式数据:

django对于json格式数据,自动将它放在请求体中.

自定义分页器

自定义分页器Django于AJAX
choice参数
MTV和MVC模型
Ajax
ContentType前后端数据编码格式
自定义分页器

 

class Pagination(object):
    def __init__(self, current_page, all_count, per_page_num=2, pager_count=11):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param pager_count:  最多显示的页码个数
​
        用法:
        queryset = model.objects.all()
        page_obj = Pagination(current_page,all_count)
        page_data = queryset[page_obj.start:page_obj.end]
        获取数据用page_data而不再使用原始的queryset
        获取前端分页样式用page_obj.page_html
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1if current_page < 1:
            current_page = 1
​
        self.current_page = current_page
​
        self.all_count = all_count
        self.per_page_num = per_page_num
​
        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager
​
        self.pager_count = pager_count
        self.pager_count_half = int((pager_count - 1) / 2)
​
    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num
​
    @property
    def end(self):
        return self.current_page * self.per_page_num
​
    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示11/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1# 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_end = self.all_pager + 1
                    pager_start = self.all_pager - self.pager_count + 1
                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1
​
        page_html_list = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
        page_html_list.append(first_page)
​
        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)
​
        page_html_list.append(prev_page)
​
        for i in range(pager_start, pager_end):
            if i == self.current_page:
                temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
            else:
                temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
            page_html_list.append(temp)
​
        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
        page_html_list.append(next_page)
​
        last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)
分页配置文件

views.py文件

def book(request):
​
    # for i in  range(1, 1001):
    #     models.Book.objects.create(title=f'第{i}本书')
# l = []
    # for i in range(1, 10001):
    #     l.append(models.Book(title=f'第{i}本书'))
    # models.Book.objects.bulk_create(l)  # 批量插入
    # book_list = models.Book.objects.all()
    # 以上方法普通方法在数据库插入数据,效率极低
# 批量插入效率非常高
    book_list = models.Book.objects.all()
    current_page = request.GET.get('page', 1)
    all_count = book_list.count()
    page_obj = mypage.Pagination(current_page=current_page,           all_count=all_count, per_page_num=10, pager_count=5)
    page_queryest = book_list[page_obj.start: page_obj.end]
​
    return render(request, 'book_list.html', locals())
分页操作