編寫(xiě)Django模型類(lèi)
在應(yīng)用的文件中,我們首先需要定義兩個(gè)模型類(lèi):fenlei和picture。fenlei表示分類(lèi),而picture表示圖片。分類(lèi)是圖片的外鍵,因?yàn)橐粡垐D片只能屬于一個(gè)分類(lèi),而一個(gè)分類(lèi)可以有多張圖片。``
在應(yīng)用的文件中,我們首先需要定義兩個(gè)模型類(lèi):fenlei和picture。fenlei表示分類(lèi),而picture表示圖片。分類(lèi)是圖片的外鍵,因?yàn)橐粡垐D片只能屬于一個(gè)分類(lèi),而一個(gè)分類(lèi)可以有多張圖片。
```python
from django.db import models
class fenlei():
name (max_length20)
status (defaultTrue)
class Meta:
db_table 'fenlei'
class picture():
title (max_length50, blankTrue)
picpath (upload_to'test')
createtime (auto_now_addTrue, blankTrue)
fl (fenlei, on_delete, blankTrue)
class Meta:
db_table 'picture'
```
在fenlei模型類(lèi)中,我們定義了name字段和status字段,name字段表示分類(lèi)的名稱,status字段表示分類(lèi)是否啟用。在picture模型類(lèi)中,我們定義了title字段、picpath字段、createtime字段和fl字段。title字段表示圖片的標(biāo)題,picpath字段表示圖片的路徑,createtime字段表示圖片的創(chuàng)建時(shí)間,fl字段表示圖片所屬的分類(lèi),它是一個(gè)外鍵關(guān)聯(lián)fenlei模型類(lèi)。
創(chuàng)建首頁(yè)路由
在工程同名文件夾的文件中,我們需要添加到首頁(yè)的路由,以便訪問(wèn)到首頁(yè)。
```python
from import admin
from django.urls import path, include
from import static
from import settings
from pic import views
urlpatterns [
path('admin/', ),
path('', _view(), name'home'),
]
urlpatterns static(_URL, document_root_ROOT)
```
這段代碼中,我們導(dǎo)入了必要的模塊和視圖函數(shù)。然后,我們定義了一個(gè)空的路由,將它綁定到showpic視圖函數(shù),命名為home。
使用Bootstrap創(chuàng)建前端導(dǎo)航欄
在模板文件中,我們可以使用Bootstrap框架來(lái)創(chuàng)建前端導(dǎo)航欄。
```html
```
這段代碼中,我們使用了ul標(biāo)簽和li標(biāo)簽來(lái)創(chuàng)建一個(gè)無(wú)序列表,通過(guò)添加class屬性和Bootstrap提供的樣式類(lèi),我們可以實(shí)現(xiàn)導(dǎo)航欄的效果。
編寫(xiě)視圖函數(shù)
在視圖函數(shù)中,我們需要處理數(shù)據(jù)并將其傳遞給模板文件進(jìn)行渲染。
```python
from import render
from import ListView
from import get_object_or_404
from .models import picture, fenlei
from utils import getpages
class showpic(ListView):
model picture
context_object_name 'pics'
template_name 'pic_'
paginate_by 3
f None
def get_context_data(self, *, object_listNone, kwargs):
context super(showpic,self).get_context_data(kwargs)
paginator ('paginator')
page ('page_obj')
pages getpages(paginator,page)
context['pages']pages
fenlei_list (statusTrue)
context['fenlei_list']fenlei_list
context['f'] self.f
print(context)
return context
def get_queryset(self):
self.f ('f',None)
if self.f:
fen get_object_or_404(fenlei,pkself.f)
return fen.picture_().order_by('-createtime')
else:
pics ().order_by('-createtime')
return pics
```
在這個(gè)視圖函數(shù)中,我們繼承了ListView類(lèi),并指定了模型類(lèi)、上下文對(duì)象名稱、模板文件和分頁(yè)數(shù)量等屬性。我們還定義了一個(gè)變量f來(lái)保存當(dāng)前所選擇的分類(lèi)。在get_context_data方法中,我們獲取分頁(yè)器和當(dāng)前頁(yè)對(duì)象,并通過(guò)調(diào)用自定義的getpages函數(shù)計(jì)算出頁(yè)碼列表,將其添加到上下文中。同時(shí),我們還需要查詢所有啟用的分類(lèi)并將其添加到上下文中。在get_queryset方法中,我們根據(jù)是否有選中分類(lèi)的情況返回不同的查詢結(jié)果。
創(chuàng)建模板文件
在上一步的視圖函數(shù)中,我們指定了使用pic_作為模板文件進(jìn)行渲染。
```html
{% for pic in pics %}
{{ pic.title }}
分類(lèi):{{ }}
{% endfor %}
- 上一頁(yè)
- {{ page }}
- {{ page }}
- 下一頁(yè)
{% if pages.has_previous %}
{% endif %}
{% for page in _range %}
{% if page %}
{% else %}
{% endif %}
{% endfor %}
{% if pages.has_next %}
{% endif %}
```
這段代碼中,我們使用了Bootstrap的card組件來(lái)展示每個(gè)圖片的標(biāo)題和分類(lèi)信息。同時(shí),我們通過(guò)調(diào)用pic.picpath.url獲取圖片的路徑,并將其作為img標(biāo)簽的src屬性值。在分頁(yè)部分,我們使用了Bootstrap的pagination組件來(lái)展示頁(yè)碼列表,并通過(guò)判斷當(dāng)前頁(yè)是否為當(dāng)前頁(yè)碼來(lái)應(yīng)用不同的樣式。最后,在表單部分,我們使用了select標(biāo)簽和option標(biāo)簽來(lái)展示分類(lèi)列表,并通過(guò)判斷當(dāng)前所選擇的分類(lèi)來(lái)設(shè)置selected屬性。
運(yùn)行Django服務(wù)器
最后,我們可以運(yùn)行Django服務(wù)器,在瀏覽器中查看效果。注意,需要提前創(chuàng)建超級(jí)用戶并上傳一張圖片,并創(chuàng)建兩個(gè)分類(lèi)。