Django實(shí)例-車輛違章查詢?nèi)?/h2>

添加視圖函數(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)上一頁,下一頁的功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容