Day25-博客系統

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

 

程序修改的部分:

 

 

 

 

 

頁面效果同上。

相關文章
相關標籤/搜索