Cách thêm chức năng tìm kiếm vào ứng dụng Django
Việc thêm tính năng tìm kiếm vào ứng dụng web của bạn cho phép người dùng của bạn điều hướng nó dễ dàng bằng cách tìm kiếm những gì họ muốn. Django cung cấp hỗ trợ tích hợp để xây dựng tính năng tìm kiếm bằng cách sử dụng các công cụ truy vấn và ORM mạnh mẽ của nó. Với Django, bạn có thể triển khai các loại tìm kiếm khác nhau, bao gồm tìm kiếm từ khóa, tìm kiếm đơn giản và tìm kiếm nâng cao bằng bộ lọc.
Mục Lục
Triển khai chức năng tìm kiếm trong Django
Django cho phép bạn triển khai các loại tìm kiếm khác nhau bằng các phương thức và chức năng tích hợp sẵn của nó. Bạn có thể triển khai tìm kiếm từ khóa đơn giản hoặc tìm kiếm nâng cao dựa trên trường hợp sử dụng của mình. Bạn nên triển khai tìm kiếm nâng cao nếu bạn có một ứng dụng phức tạp, chẳng hạn như trang web thương mại điện tử, trong khi tìm kiếm từ khóa đơn giản phù hợp với các dự án ít phức tạp hơn.
Bạn có thể tìm thấy mã được sử dụng trong bài viết này trên GitHub và miễn phí cho bạn sử dụng theo giấy phép MIT.
Thực hiện tìm kiếm từ khóa đơn giản trong Django
Để tạo một tính năng tìm kiếm đơn giản, bạn nên bắt đầu bằng cách xây dựng thanh tìm kiếm của mình. Bạn có thể tạo thanh tìm kiếm trong thanh điều hướng của mình. Bootstrap cung cấp một thanh điều hướng được tạo sẵn với thanh tìm kiếm và bạn có thể dễ dàng tích hợp Bootstrap và các thành phần của nó vào dự án Django của mình. Tạo thanh tìm kiếm của bạn trong tệp HTML, đặt phương thức biểu mẫu thành BƯU KIỆN, và cung cấp cho trường đầu vào một tên thuộc tính như thế này:
<form class="d-flex" role="search" method="POST">
{% csrf_token %}
<input
class="form-control me-2"
type="search"
placeholder="Search"
name="search_query"
required aria-label="Search"
>
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
Trong đoạn mã trên, tên của trường đầu vào là search_query. Biểu mẫu sử dụng mã thông báo CSRF của Django để ngăn chặn các cuộc tấn công CSRF. Để làm cho thanh tìm kiếm của bạn hoạt động, hãy làm theo các bước sau.
Tạo Chế độ xem cho Tìm kiếm
- mở của bạn lượt xem.py tệp và nhập mô hình của bạn từ mô hình.py tài liệu:
from .models import ModelName
- Tạo chức năng xem cho tính năng tìm kiếm:
def search_feature(request):
if request.method == 'POST':
search_query = request.POST['search_query']
posts = Model.objects.filter(fieldName__contains=search_query)
return render(request, 'app/template_name.html', {'query':search_query, 'posts':posts})
else:
return render(request, 'app/template_name.html',{})
Trước tiên, chức năng trên kiểm tra xem máy khách có đang gửi một BƯU KIỆN lời yêu cầu. Nếu vượt qua kiểm tra, nó sẽ tiếp tục truy xuất giá trị của truy vấn tìm kiếm của người dùng như sau:
search_query = request.POST['search_query']
Đang yêu cầu.POST[’search_query’], ‘search_query’ nên được thay thế bằng tên trường nhập của thanh tìm kiếm của bạn.
Sau khi truy xuất giá trị của truy vấn tìm kiếm của người dùng, chức năng lọc mô hình với nó bằng cách sử dụng __chứa phương pháp. Các __chứa phương pháp không phân biệt chữ hoa chữ thường. Để sử dụng phương pháp này, bạn nên làm theo định dạng sau:
fieldName__contains
Ví dụ: nếu bạn muốn người dùng của mình tìm kiếm dựa trên trường mô hình có tên tênbạn nên sửa đổi mã của mình thành như sau:
name__contains=search_query
Cuối cùng, hàm hiển thị một mẫu và chuyển truy vấn tìm kiếm và mô hình được lọc dưới dạng ngữ cảnh.
Tuy nhiên, nếu phương thức của biểu mẫu không phải là một BƯU KIỆN yêu cầu, hàm sẽ hiển thị mẫu có từ điển trống và không xử lý truy vấn tìm kiếm.
Tạo Mẫu cho Kết quả Tìm kiếm
- Tạo một tệp HTML để trả về kết quả tìm kiếm của bạn cho phía máy khách.
- Xuất kết quả tìm kiếm trên trang để người dùng xem. Mã trong tệp HTML của bạn sẽ giống như sau:
{% if query %}
<div>
<div>
{% for post in posts %}
<div>
<p>{{post.title}}</p>
</div>
{% endfor %}
</div>
</div>
{% else %}
<h1>Please enter a search query</h1>
{% endif %}
Mẫu HTML ở trên kiểm tra xem người dùng có nhập truy vấn tìm kiếm vào thanh tìm kiếm hay không. Nếu người dùng nhập một truy vấn tìm kiếm, một cho vòng lặp lặp lại các kết quả tìm kiếm và trả về cho người dùng. Khi không có truy vấn tìm kiếm, một thông báo sẽ được hiển thị để người dùng nhập truy vấn tìm kiếm. Trường hợp có thể không có truy vấn tìm kiếm là nếu người dùng của bạn truy cập trực tiếp vào URL mà không điền vào thanh tìm kiếm, nghĩa là người dùng của bạn nhập một URL chẳng hạn như mywebsite.com/search trực tiếp vào trình duyệt. Bạn nên đảm bảo rằng bạn sử dụng kế thừa mẫu của Django trong tệp HTML của mình.
- Sửa đổi mã HTML của bạn để trả về thông báo lỗi nếu không có kết quả tìm kiếm.
{% if query %}
<div>
<div>
{% if posts %}
{% for post in posts %}
<div>
<p>{{post.title}}</p>
</div>
{% endfor %}
{% else %}
<h3>No search results found</h3>
{% endif %}
</div>
</div>
{% else %}
<h1>Please enter a search query</h1>
{% endif %}
Mẫu HTML mới cho phép trải nghiệm người dùng tốt hơn. Nó giới thiệu một câu lệnh có điều kiện để kiểm tra xem kết quả tìm kiếm có sẵn trong cơ sở dữ liệu hay không. Nếu có, nó sẽ hiển thị kết quả tìm kiếm; nếu không, nó sẽ gửi cho người dùng một thông báo lỗi.
Định cấu hình các mẫu URL của bạn
- Nếu bạn chưa làm điều này, hãy tạo một url.py tập tin trong thư mục ứng dụng của bạn.
- trong bạn url.py, tạo một mẫu URL cho trang tìm kiếm của bạn:
from django.urls import path
from . import viewsurlpatterns = [
path('search/', views.search_feature, name='search-view'),
]
Chương trình trên đầu tiên nhập khẩu con đường chức năng và lượt xem tập tin liên quan đến ứng dụng. Sau đó, nó tạo ra một đường dẫn có tên chế độ xem tìm kiếm cho trang tìm kiếm.
- Thêm một hành động biểu mẫu vào thanh tìm kiếm của bạn. URL hành động phải trỏ đến đường dẫn URL dành riêng cho chế độ xem tìm kiếm. Trong trường hợp này, biểu mẫu trỏ đến chế độ xem tìm kiếm.
<form class="d-flex" role="search" method="POST" action="{% url 'search-view' %}">
<input
class="form-control me-2"
type="search"
placeholder="Search for something"
name="search_query"
required aria-label="Search"
>
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
Nếu không có hành động biểu mẫu trỏ đến đường dẫn URL tìm kiếm của bạn, tính năng tìm kiếm của bạn sẽ không hoạt động. Hãy nhớ rằng đường dẫn URL tìm kiếm của bạn phải trỏ đến chế độ xem Django xử lý logic tính năng tìm kiếm của bạn.
Tạo một tính năng tìm kiếm cho nhiều trường mô hình
Nếu muốn cải thiện trải nghiệm người dùng cho ứng dụng web của mình, bạn có thể cho phép người dùng tìm kiếm theo nhiều trường trong mô hình của mình. Chẳng hạn, trong một ứng dụng blog, bạn có thể muốn người dùng của mình tìm kiếm dựa trên tiêu đề bài đăng hoặc tên tác giả.
Để thực hiện tính năng này, bạn nên sử dụng Hỏi đối tượng được cung cấp bởi Django. Bạn nên nhập khẩu Hỏi đối tượng trong của bạn lượt xem.py tập tin như thế này:
from django.db.models import Q
Sau khi nhập Hỏibạn nên sửa đổi chức năng xem của mình như sau:
def search_post(request):
if request.method == 'POST':
search_query = request.POST['search_query']
posts = Post.objects.filter(Q(title__icontains=search_query) | Q(author__icontains=search_query))
return render(request, 'app/template_name.html', {'query':search_query, 'posts':posts})
else:
return render(request, 'app/template_name.html',{})
Trong chương trình trên, các bài viết biến lọc mô hình theo tiêu đề bài đăng hoặc tên tác giả. Chức năng sử dụng các HOẶC toán tử—trong trường hợp này là ký hiệu đường ống—để thực hiện bộ lọc.
Cải thiện trải nghiệm người dùng với tính năng tìm kiếm
Tính năng tìm kiếm trong ứng dụng web của bạn cải thiện hiệu quả trải nghiệm người dùng và khả năng sử dụng tổng thể của nó. Với Django, bạn chỉ cần tận dụng các chức năng tích hợp sẵn để làm cho tính năng tìm kiếm của bạn hoạt động, mang lại lợi ích đáng kể cho bạn và người dùng của bạn.