添加視圖函數(shù)
在view.py文件中添加視圖函數(shù),拿到請求,返回響應(yīng),給出數(shù)據(jù),渲染頁面
from django.shortchs import render
def search(request):
# 在表單中取carno,沒取出給空值
carno = request.POST.get('carno','')
if carno:
#去掉拿到車牌中間的空字符
carno = carno.replace(' ', '')
# 通過Record這個模型的模型管理器的filter方法,通過car對象的carno屬性去篩選出 # 和表單拿到的車牌號相同的記錄,返回一個查詢集對象
queryset = Record.objects.filter(car__carno=carno)
# 將查詢集對象添加到字典中
context = {'records': queryset}
return render(request, 'index.html', context)
視圖函數(shù)完成之后在urls.py文件添加視圖函數(shù)的路徑。
urlpatterns = [
……
path('search/',search),
]
修改模板頁面index.html
<form id="form" action="/search/" method="post">
{% csrf_token %}
<input type="text" name="carno" placeholder="請輸入車牌號或車主姓名"/>
<input type="submit" value="查詢"/>
</form>
<hr /><br />
{% if records %}
<table>
<tr>
<th>車牌</th>
<th>車主</th>
<th>時間</th>
<th>地點(diǎn)</th>
<th>違章原因</th>
<th>處罰方式</th>
<th>是否受理</th>
<th>操作</th>
</tr>
{% for record in records %}
<tr>
<td>{{ record.car.car_no }}</td>
<td>{{ record.car.owner }}</td>
<td>{{ record.offend_time }}</td>
<td>{{ record.offend_place }}</td>
<td>{{ record.offend_reason }}</td>
<td>{{ record.punish }}</td>
<td>{{ record.dealed | yesno:'已受理,未受理' }}</td>
</tr>
{% endfor %}
</table>
{% else %}
<h3>沒有查詢到違章記錄</h3>
{% endif %}
在重新運(yùn)行項(xiàng)目,搜索框中輸入要查詢的車牌號信息。

search.png
結(jié)果

result.png
模糊查詢+多條件查詢
在字段后面加上
# 模糊查詢
__exact #表示精確查詢
__contains # 包含,相當(dāng)于在字符串的頭尾加%的模糊查詢
__startswith # 表示以什么開頭的模糊查詢
__endswith # 表示以什么結(jié)尾的模糊查詢
# 注意:如果在參數(shù)前面加i,表示忽略大小寫的模糊查詢。使用__contains和__endswith會導(dǎo)致程序性能很差。
queryset = Record.objects.filter(car__carno__istarswith=carno)
# 查詢在Recor模型的模型管理器(objects)里面查詢car對象的carno屬性(忽略大小寫、以什么開頭)的記錄,返回一個查詢集。
Django中有個Q對象,,使用時需要導(dǎo)入,用于多條件查詢,我們可以使用符號&或者|將多個Q()對象組合起來傳遞給filter(),exclude(),get()等函數(shù) 。
from django.db.models import Q
# | 表示‘或者’的意思
# & 表示’并且‘的意思
# ~ 表示‘非’的意思
#例如:
Q(car__carno__startswith='川A') | Q(car__owner__contains='王')
相當(dāng)于SQL語句:
# select * from tb1 where carno like '川A%' or owner like '%王%';這樣的查詢語句。
# 車牌或者車主姓名模糊查詢查詢
queryset = Record.objects.filter(
Q(car__carno__istarswith=carno) |
Q(car__owner__contains=carno)
)
分頁操作
可以對查詢集進(jìn)行切片操作來達(dá)到分頁的效果。
def search(request):
context = {'searched': False}
if request.method == 'POST':
carno = request.POST.get('carno','')
# 將拿到的車牌做去掉空格,轉(zhuǎn)大寫處理
carno = carno.replace(' ', '').upper()
context['carno'] = carno
page = int(request.POST.get('page', '1'))
size = int(request.POST.get('size', '5'))
if carno:
context['searched'] = True
context['current_page'] = page
total = Record.objects.filter(
Q(car__carno__istarswith=carno) |
Q(car__owner__contains=carno)
).count()
# 總頁數(shù)
context['total_page'] = math.ceil(total / size)
# 頁面顯示的記錄的條偶數(shù)
queryset = Record.objects.filter(
Q(car__carno__istarswith=carno) |
Q(car__owner__contains=carno)
)[(page - 1) * size:page * size]
context['records'] = queryset
return render(request, 'index.html', context)
在視圖函數(shù)中修改好之后,就可以去前端頁面添加相應(yīng)的模板語法。用Vue實(shí)現(xiàn)上一頁,下一頁的功能。