博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python基础(二十五)
阅读量:4550 次
发布时间:2019-06-08

本文共 7622 字,大约阅读时间需要 25 分钟。

一、组合搜索表

第一种:最简单的方式

models.py里面的设置:

from django.db import models# Create your models here.class Category(models.Model):  #创建一个标签表    caption = models.CharField(max_length=16)# class ArticleType(models.Model): #文章类型分类表动态的就要搞表#     caption = models.CharField(max_length=16)class Article(models.Model):创建一个标题和内容表    title = models.CharField(max_length=32)    content = models.CharField(max_length=255)        category = models.ForeignKey(Category)  #建立外键约束    article_type = models.ForeignKey(ArticleType)

urls.py里面的设置:

from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [     url(r'^article/',views.article),]

app01/views.py里面的设置:

from django.shortcuts import renderfrom app01 import modelsdef article(request):    result = models.Article.objects.all()    return  render(request,'article.html',{
'result':result})

article.html里面的设置:

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}

查看结果(下面的数据需要提前去表里面创建一些好看效果):

第二种:我们让内容显示的更多一点

app01/views.py里面的设置:

from django.shortcuts import renderfrom app01 import modelsdef article(request,*args,**kwargs):    article_type_list = models.ArticleType.objects.all()    category_list = models.Category.objects.all()    result = models.Article.objects.all()    return  render(        request,        'article.html',        {            'result':result,            'article_type_list':article_type_list,            'category_list':category_list        })

article.html里面的设置:

    
Title

过滤条件

{
% for row in article_type_list %}
{
{ row.caption }}
{
% endfor %}
{
% for row in category_list %}
{
{ row.caption }}
{
% endfor %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}

查看结果:

 

第三种:点击不同的过滤条件,url发生对应的跳转,并有颜色显示:

app01/views.py里面的设置:

from django.shortcuts import render# Create your views here.from app01 import modelsfrom django.urls import  reversedef article(request,*args,**kwargs):    print(kwargs)    condition = {}    for k,v in kwargs.items():        kwargs[k] = int(v)        if v == '0':            pass        else:            condition[k] = v    article_type_list = models.ArticleType.objects.all()    category_list = models.Category.objects.all()    result = models.Article.objects.filter(**condition)    return  render(        request,        'article.html',        {            'result':result,            'article_type_list':article_type_list,            'category_list':category_list,            'arg_dict':kwargs        })
View Code

article.html里面的设置:

    
Title

过滤条件

{
% if arg_dict.article_type_id == 0 %}
全部 {
% else %}
全部 {
% endif %} {
% for row in article_type_list %} {
% if row.id == arg_dict.article_type_id %}
{
{ row.caption }}
{
% else %}
{
{ row.caption }}
{
% endif %} {
% endfor %}
{
% if arg_dict.category_id == 0 %}
全部 {
% else %}
全部 {
% endif %} {
% for row in category_list %} {
% if row.id == arg_dict.category_id %}
{
{ row.caption }}
{
% else %}
{
{ row.caption }}
{
% endif %} {
% endfor %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}
View Code

显示结果:

 

第四种:通过函数实现,前端html页面不用写那么多代码:

app01/templatetags/filter.py的设置

 

from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()@register.simple_tagdef filter_all(arg_dict,k):    if k == 'article_type_id':        n1 = arg_dict['article_type_id']        n2 = arg_dict['category_id']        if n1 == 0:            ret = '全部' % n2        else:            ret = '全部' % n2    else:        n1 = arg_dict['category_id']        n2 = arg_dict['article_type_id']        if n1 == 0:            ret = '全部' % n2        else:            ret = '全部' % n2    return mark_safe(ret)@register.simple_tagdef filter_article_type(article_type_list,arg_dict):    ret = []    for row in article_type_list:        if row.id == arg_dict['article_type_id']:            temp = '%s' %(row.id,arg_dict['category_id'],row.caption,)        else:            temp = '%s' %(row.id,arg_dict['category_id'],row.caption,)        ret.append(temp)    return  mark_safe(''.join(ret))@register.simple_tagdef filter_category_type(category_list,arg_dict):    ret = []    for row in category_list:        if row.id == arg_dict['category_id']:            temp = '%s' %(arg_dict['article_type_id'],row.id,row.caption,)        else:            temp = '%s' %(arg_dict['article_type_id'],row.id,row.caption,)        ret.append(temp)    return  mark_safe(''.join(ret))
View Code

 

article.html的页面设置:

{% load filter %}    

过滤条件

{
% filter_all arg_dict 'article_type_id' %} {
% filter_article_type article_type_list arg_dict %}
{
% filter_all arg_dict 'category_id' %} {
% filter_category_type category_list arg_dict %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}
View Code

查看结果:

 

二、JSONP:

jsonp是一种请求方式,用来解决一些棘手的问题。

先要提一下下面的get方式:

Import requests

request.get(‘http://www.baidu.com’)  #往百度发一个get请求

request.post(‘http://www.baidu.com’)  #往百度发一个post请求

下面是使用方式:

import  requestsdef req(request):    response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301')    print(response.text)  #所有的文本内容    print(response.cookies)  #所有的cookies    print(response.headers)  #所有的响应头

 

下面是一个request.get的例子:

 urls.py的设置

from app02 import  views as a2urlpatterns = [    url(r'^req/',a2.req),]

app02/views设置:

import  requestsdef req(request):    response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301')    response.encoding = 'utf-8' #表示让字节用utf8编码编成字符串    #print(response.content) #字节类型    print(response.text)  #字符串类型的    return  render(request,'req.html',{
'result':response.text})

html页面req.html设置:

   {
{ result }}

结果显示:

 

现在这种模式是用户浏览器发送数据到我们的服务器端,然后服务器端再向天气服务器获取数据然后服务器端再把数据返回给浏览器。

 

第二个例子:我们用这个形式让浏览器直接向天气网站发请求获取数据:

下面是html里面的设置:

   

后台获取的结果

{
{ result }}

js直接获取结果

查看结果:

浏览器会出现下面的问题:

XMLHttpRequest cannot load http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access.

其实我们的请求已经发送到了Html页面里面设置的URL,但是浏览器具有同源策略,如果直接去别的域名去请求数据,浏览器直接就会拒绝掉返回的数据。

这时候我们就要解决浏览器阻止Ajax的请求,绕过去,浏览器无法阻止<script src='...'></script>,返回的数据必须是js格式。

并且jsonp只能发get请求。遵循统一规则callback。

 

第三个例子:

下面是正确的取值方式:

req.html:

   

后台获取的结果

{
{ result }}

js直接获取结果

View Code

查看结果:

第四个例子用jquery方式,这也是比较常用的方式:

查看结果:

转载于:https://www.cnblogs.com/chaishao/p/6437336.html

你可能感兴趣的文章
linux 编译运行c文件
查看>>
Scrapy的学习和使用
查看>>
7.内部类(一)之详解内部类
查看>>
1.messager消息提示框
查看>>
[PY]进制转换
查看>>
STL系列 list
查看>>
NAT穿透
查看>>
[VC] 枚举ActiveX控件的 CLSID 和 implemented/required CATIDs 的小工具
查看>>
匿名方法和Lambda表达式
查看>>
Spark编译的三种方式
查看>>
京东的核心业务
查看>>
读书笔记(六)--成交
查看>>
Secret Number hdu 2113
查看>>
软件架构(体系结构,Architecture)和软件框架
查看>>
阶梯博弈(没怎么搞懂)
查看>>
python request post请求body中有json数组
查看>>
IDT hook KiTrap03
查看>>
字节对齐
查看>>
使用Python SocketServer快速实现多线程网络服务器
查看>>
离散数学
查看>>