成果:
代碼:
在之后的步驟中在相信說明吧
步驟:
1.這個mongoengine需要pip安裝的pip install mongoengine
命令即可實現(xiàn)
建立與數(shù)據(jù)庫的鏈接辱志,connect的第一個參數(shù)是數(shù)據(jù)庫的名稱
2.在第一步之后,在models中
from django.db import models
from mongoengine import *
# from mongoengine import connect
# connect('ceshi', host='127.0.0.1', port=27017)
# Create your models here.
class ItemInfo(Document):
# StringField()的意思就是字符串
title = StringField()
# ListField的意思就是列表化一下
area = ListField(StringField())
pub_date = StringField()
look = StringField()
url = StringField()
cates = ListField(StringField())
time = StringField()
price = StringField()
meta = {
'collection': 'item_info',
}
# 親測可用
# for i in ItemInfo.objects[:1]:
# print(i.title)
我個人的理解是初始化數(shù)據(jù)庫,這個是數(shù)據(jù)庫事先存在的情況下舟铜,與數(shù)據(jù)庫建立連接辜伟。而且在class中,每一項右側(cè)都要跟數(shù)據(jù)庫的key一致(必須一樣坚冀,如果不一致就報錯了)
可以看到济赎,在前后注釋掉的東西可以用來驗證是否成功
3.在view.py中
需要導(dǎo)入這個類
from ganji.models import ItemInfo
def index(request):
limit = 4
# 取出20個元素
item_info = ItemInfo.objects[:1]
# 下面的語句跟上面語句等價,但是為什么索引在這里
# 仿佛失效的樣子
# item_info = ItemInfo.objects.all()
# 分頁器记某,前面是總共的元素司训,limit是每頁的元素個數(shù)
paginator = Paginator(item_info, limit)
print('頁碼數(shù)量', paginator.num_pages)
# 從頁面獲取頁數(shù)信息,這里是獲日尬场豁遭?后參數(shù)page的value,
# 可以看到get后的‘page’并不是我們定義的,而是我們獲取的
# 它的值就是個int
page = request.GET.get('page', 1)
# 顯示某‘page’頁面的信息
loaded = paginator.page(page)
# print('這里是loaded', loaded)
print('page_range', paginator.page_range)
context = {
'item_info': loaded,
}
# context是關(guān)鍵字贺拣,傳入字典蓖谢,但是這個字典的key才是在HTML中用到的
# 這點跟flask不一樣,flask是隨便定義user=user,左邊是模板中的譬涡,右邊是views中的
return render(request, 'index.html', context)
4.同時在HTML文件中
寫入信息闪幽,用循環(huán)既可,這點跟jinja2很相似涡匀,但是需要注意的是:
我們用的是context的key盯腌,并不是context本身
{% for item in item_info %}
<section class="post">
<header class="post-header">
<h2 class="post-title">{{ item.title }}</h2>
<p class="post-meta">
{% for cate in item.cates %}
<a class="post-category post-category-design" href="#">{{ cate }}</a>
{% endfor %}
<br>
<br>
{% for a in item.area %}
<a class="post-category post-category-pure" href="#">{{ a }}</a>
{% endfor %}
</p>
</header>
<div class="post-description">
<p>
¥{{ item.price }}---{{ item.pub_date }}
</p>
</div>
</section>
{% endfor %}
5.分頁器
在views視圖函數(shù)中導(dǎo)入本次的重點--分頁器(詳細(xì)資料點擊查看)
from django.core.paginator import Paginator
需要在HTML中特意做出來這個分頁器。
其原理是:顯示頁碼陨瘩,當(dāng)點擊上一頁下一頁的時候腕够,會自動給視圖函數(shù)傳參數(shù),然后根據(jù)這個參數(shù)舌劳,返回數(shù)據(jù)給HTML渲染
<div class="footer">
<div class="pure-menu pure-menu-horizontal">
<ul>
<li class="pure-menu-item"><a href="?page=1" class="pure-menu-link">首頁</a></li>
{% if item_info.has_previous %}
<li class="pure-menu-item"><a href="?page={{ item_info.previous_page_number }}" class="pure-menu-link">< pre</a></li>
{% endif %}
<li class="pure-menu-item"><span> {{ item_info.number }} of {{ item_info.paginator.num_pages }}</span></li>
{% if item_info.has_next %}
<li class="pure-menu-item"><a href="?page={{ item_info.next_page_number }}" class="pure-menu-link">next ></a></li>
{% endif %}
<li class="pure-menu-item"><a href="?page={{ item_info.paginator.num_pages }}" class="pure-menu-link">尾頁</a></li>
</ul>
</div>
</div>
其中用到了很多函數(shù)帚湘,可以查看分頁器的詳細(xì)介紹
新技能GET:
1.分頁器--http://python.usyiyi.cn/django/topics/pagination.html
2.流程是:
setting中注冊數(shù)據(jù)庫->models中引入數(shù)據(jù)庫->views中使用數(shù)據(jù)庫->最終用數(shù)據(jù)庫渲染
遇到的坑:
1.在models中引入數(shù)據(jù)庫的時候
class ItemInfo(Document):
其中的對象是以大寫字母D開頭的Document
2.在views.py中,item_info = ItemInfo.objects[:1]
是復(fù)數(shù)的objects甚淡,復(fù)數(shù)大诸!
疑問未決:
如圖,第十行的代碼中索引好像完全不起作用贯卦,無論改為多少资柔,都能在第15行初始化中加載所有的object!而在11行print(item_info)中還是1撵割,到16行就已經(jīng)是所有數(shù)據(jù)都加載進去了;哐摺!