1. 搭建環境請參考:http://www.cnblogs.com/momo8238/p/7508677.htmlhtml
2.建立3張表備用python
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) # 若是類型是一成不變的,咱們就把它放到內存裏面。它就永遠只在內存中保存一份。 # type_choice=( # (0,'Python'), # (1,'OpenStack'), # (2,'Linux'), # ) # article_type_id=models.IntegerField(choices=type_choice)
運行下面2句建立表:django
python manage.py makemigrations python manage.py migrage
3. 往表裏面增長數據app
4. 用原來的方法實現查詢。函數
urls.pyurl
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article/', views.article), ]
views.pyspa
from django.shortcuts import render from app01 import models def article(request): result=models.Article.objects.all() return render(request,'article.html',{'result':result})
article.html3d
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
頁面效果:htm
5. 下面嘗試實現組合查詢
6. 把條件和內容都顯示到頁面上。
views.py
from django.shortcuts import render from app01 import models 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, } )
article.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> <a>所有</a> {% for row in article_type_list %} <a>{{row.caption}}</a> {% endfor %} </div> <div> <a>所有</a> {% for row in category_list %} <a>{{row.caption}}</a> {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
頁面效果:
7. 爲了後面能夠自由選擇,須要修改urls.py 爲可接收參數類型的。
說明:article_type_id=第1個參數; category_id=第2個參數。而且把它們二者做爲數據庫查詢的條件直接傳遞進去。
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article), ]
打印看下:
程序的進化:
8. 增長「所有「所對應」的展現全部選項的功能
程序說明:
效果展現:
程序粘貼:
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 url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article), ]
views.py
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): # {'article_type_id':'1','category_id':'2'},可是這裏面沒有包含「所有」所對應的項。 print(kwargs) condition={} for k,v in kwargs.items(): 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, } )
article.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> <a>所有</a> {% for row in article_type_list %} <a>{{row.caption}}</a> {% endfor %} </div> <div> <a>所有</a> {% for row in category_list %} <a>{{row.caption}}</a> {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
8. 在頁面上增長選擇的功能
經過request.path_info 獲取當前url
根據名字反生成URL
9. 在上次URL(當前URL)的基礎上實現組合查詢,這塊要理解,很重要。
urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article,name='article'), ]
views.py
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): # {'article_type_id':'1','category_id':'2'},可是這裏面沒有包含「所有」所對應的項。 print(kwargs) print(request.path_info) from django.urls import reverse url=reverse('article',kwargs=kwargs) print(url) condition={} for k,v in kwargs.items(): 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 } )
article.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> <div>article_type</div> <a>所有</a> {% for row in article_type_list %} <a href="/article-{{row.id}}-{{arg_dict.category_id}}.html">{{row.caption}}</a> {% endfor %} </div> <div> <div>category</div> <a>所有</a> {% for row in category_list %} <a href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
頁面效果:
10. 把選中的項目高亮顯示
views.py
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): # {'article_type_id':'1','category_id':'2'},可是這裏面沒有包含「所有」所對應的項。 print(kwargs) print(request.path_info) from django.urls import reverse url=reverse('article',kwargs=kwargs) print(url) 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 } )
article.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } .condition a.active{ background-color:brown; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> <div>article_type</div> <a>所有</a> {% for row in article_type_list %} {% if row.id == arg_dict.article_type_id %} <a class="active" href="/article-{{row.id}}-{{arg_dict.category_id}}.html">{{row.caption}}</a> {% else %} <a href="/article-{{row.id}}-{{arg_dict.category_id}}.html">{{row.caption}}</a> {% endif %} {% endfor %} </div> <div> <div>category</div> <a>所有</a> {% for row in category_list %} {% if row.id == arg_dict.category_id %} <a class="active" href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% else %} <a href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% endif %} {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
頁面效果:
11. 給所有也增長上。最重要的點就是:要獲取上次URL給傳過來的參數。
程序粘貼:
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 url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article,name='article'), ]
views.py
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): # {'article_type_id':'1','category_id':'2'},可是這裏面沒有包含「所有」所對應的項。 print(kwargs) print(request.path_info) from django.urls import reverse url=reverse('article',kwargs=kwargs) print(url) 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 } )
article.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } .condition a.active{ background-color:brown; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> <div>article_type</div> {% if arg_dict.article_type_id == 0 %} <a class="active" href="/article-0-{{arg_dict.category_id}}.html">所有</a> {% else %} <a href="/article-0-{{arg_dict.category_id}}.html">所有</a> {% endif %} {% for row in article_type_list %} {% if row.id == arg_dict.article_type_id %} <a class="active" href="/article-{{row.id}}-{{arg_dict.category_id}}.html">{{row.caption}}</a> {% else %} <a href="/article-{{row.id}}-{{arg_dict.category_id}}.html">{{row.caption}}</a> {% endif %} {% endfor %} </div> <div> <div>category</div> {% if arg_dict.category_id == 0 %} <a class="active" href="/article-{{arg_dict.article_type_id}}-0.html">所有</a> {% else %} <a href="/article-{{arg_dict.article_type_id}}-0.html">所有</a> {% endif %} {% for row in category_list %} {% if row.id == arg_dict.category_id %} <a class="active" href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% else %} <a href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% endif %} {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
頁面效果:
12.對現有程序進行改版,把複雜的邏輯判斷寫到函數裏面。
在day25下面建立1個文件夾,命名爲:templatetags,下面新建一個filter.py文件
程序粘貼:
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 url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article,name='article'), ]
views.py
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): # {'article_type_id':'1','category_id':'2'},可是這裏面沒有包含「所有」所對應的項。 print(kwargs) print(request.path_info) from django.urls import reverse url=reverse('article',kwargs=kwargs) print(url) 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 } )
article.html
{% load filter %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding:3px 5px; border:1px solid #dddddd; margin:5px 5px; } .condition a.active{ background-color:brown; } </style> </head> <body> <h1>過濾條件</h1> <div class="condition"> <div> {% filter_all arg_dict 'article_type_id' %} {% filter_article_type article_type_list arg_dict %} </div> <div> {% filter_all arg_dict 'category_id' %} {% for row in category_list %} {% if row.id == arg_dict.category_id %} <a class="active" href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% else %} <a href="/article-{{arg_dict.article_type_id}}-{{row.id}}.html">{{row.caption}}</a> {% endif %} {% endfor %} </div> </div> <h1>查詢結果</h1> <ul> {% for row in result %} <li>{{row.id}}-{{row.title}}</li> {% endfor %} </ul> </body> </html>
filter.py
from django import template from django.utils.safestring import mark_safe register=template.Library() @register.simple_tag def 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 = '<a class="active" href="/article-0-%s.html">所有</a>' % n2 else: ret = '<a href="/article-0-%s.html">所有</a>' % n2 else: n1 = arg_dict['category_id'] n2 = arg_dict['article_type_id'] if n1 == 0: ret = '<a class="active" href="/article-%s-0.html">所有</a>' % n2 else: ret = '<a href="/article-%s-0.html">所有</a>' % n2 return mark_safe(ret) @register.simple_tag def filter_article_type(article_type_list,arg_dict): ret=[] for row in article_type_list: if row.id == arg_dict['article_type_id']: temp='<a class="active" href = "/article-%s-%s.html">%s</a>'%(row.id,arg_dict['category_id'],row.caption,) else: temp = '<a href = "/article-%s-%s.html">%s</a>'%(row.id,arg_dict['category_id'],row.caption,) ret.append(temp) return mark_safe(''.join(ret))
頁面效果:
13. 若是articletype是一成不變的,那麼咱們能夠嘗試把數據寫到內存中。從新建立表
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) # 若是類型是一成不變的,咱們就把它放到內存裏面。它就永遠只在內存中保存一份。 type_choice=( (1,'Python'), (2,'OpenStack'), (3,'Linux'), ) article_type_id=models.IntegerField(choices=type_choice)
程序:
python manage.py makemigrations python manage.py migrate
程序修改的部分:
頁面效果同上。