編寫Django模型類
在應(yīng)用的文件中,我們首先需要定義兩個模型類:fenlei和picture。fenlei表示分類,而picture表示圖片。分類是圖片的外鍵,因?yàn)橐粡垐D片只能屬于一個分類,而一個分類可以有多張圖片。``
在應(yīng)用的文件中,我們首先需要定義兩個模型類:fenlei和picture。fenlei表示分類,而picture表示圖片。分類是圖片的外鍵,因?yàn)橐粡垐D片只能屬于一個分類,而一個分類可以有多張圖片。
```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模型類中,我們定義了name字段和status字段,name字段表示分類的名稱,status字段表示分類是否啟用。在picture模型類中,我們定義了title字段、picpath字段、createtime字段和fl字段。title字段表示圖片的標(biāo)題,picpath字段表示圖片的路徑,createtime字段表示圖片的創(chuàng)建時間,fl字段表示圖片所屬的分類,它是一個外鍵關(guān)聯(lián)fenlei模型類。
創(chuàng)建首頁路由
在工程同名文件夾的文件中,我們需要添加到首頁的路由,以便訪問到首頁。
```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ù)。然后,我們定義了一個空的路由,將它綁定到showpic視圖函數(shù),命名為home。
使用Bootstrap創(chuàng)建前端導(dǎo)航欄
在模板文件中,我們可以使用Bootstrap框架來創(chuàng)建前端導(dǎo)航欄。
```html
```
這段代碼中,我們使用了ul標(biāo)簽和li標(biāo)簽來創(chuàng)建一個無序列表,通過添加class屬性和Bootstrap提供的樣式類,我們可以實(shí)現(xiàn)導(dǎo)航欄的效果。
編寫視圖函數(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
```
在這個視圖函數(shù)中,我們繼承了ListView類,并指定了模型類、上下文對象名稱、模板文件和分頁數(shù)量等屬性。我們還定義了一個變量f來保存當(dāng)前所選擇的分類。在get_context_data方法中,我們獲取分頁器和當(dāng)前頁對象,并通過調(diào)用自定義的getpages函數(shù)計(jì)算出頁碼列表,將其添加到上下文中。同時,我們還需要查詢所有啟用的分類并將其添加到上下文中。在get_queryset方法中,我們根據(jù)是否有選中分類的情況返回不同的查詢結(jié)果。
創(chuàng)建模板文件
在上一步的視圖函數(shù)中,我們指定了使用pic_作為模板文件進(jìn)行渲染。
```html
{% for pic in pics %}
{{ pic.title }}
分類:{{ }}
{% endfor %}
- 上一頁
- {{ page }}
- {{ page }}
- 下一頁
{% if pages.has_previous %}
{% endif %}
{% for page in _range %}
{% if page %}
{% else %}
{% endif %}
{% endfor %}
{% if pages.has_next %}
{% endif %}
```
這段代碼中,我們使用了Bootstrap的card組件來展示每個圖片的標(biāo)題和分類信息。同時,我們通過調(diào)用pic.picpath.url獲取圖片的路徑,并將其作為img標(biāo)簽的src屬性值。在分頁部分,我們使用了Bootstrap的pagination組件來展示頁碼列表,并通過判斷當(dāng)前頁是否為當(dāng)前頁碼來應(yīng)用不同的樣式。最后,在表單部分,我們使用了select標(biāo)簽和option標(biāo)簽來展示分類列表,并通過判斷當(dāng)前所選擇的分類來設(shè)置selected屬性。
運(yùn)行Django服務(wù)器
最后,我們可以運(yùn)行Django服務(wù)器,在瀏覽器中查看效果。注意,需要提前創(chuàng)建超級用戶并上傳一張圖片,并創(chuàng)建兩個分類。