📅  最后修改于: 2023-12-03 14:52:32.588000             🧑  作者: Mango
开发一个搜索栏是在 Web 应用中非常常见的需求。在 React 和 Django 中,我们可以相对容易地制作搜索功能。本文将介绍如何利用 React 和 Django 制作一个基本的搜索栏。
我们在 React 中需要创建一个表单,并使用 React hooks 来获取用户的输入。使用 useState
hook 来创建一个 input state 来存储用户输入的关键字:
import React, { useState } from 'react';
function SearchBar({ onSearch }) {
const [input, setInput] = useState('');
const handleSubmit = e => {
e.preventDefault();
onSearch(input);
setInput('');
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={input}
onChange={e => setInput(e.target.value)}
/>
<button type="submit">搜索</button>
</form>
);
}
上面的代码中,我们创建了一个 SearchBar 组件,它接受 onSearch 函数作为 props。onSearch 函数将会在表单提交时被调用,并把输入的关键字作为参数传入。
handleSubmit 函数被用来处理表单提交事件。在用户点击提交按钮时,它会调用 onSearch 函数并重置 input state。input state 的值被绑定到了 input 标签上,所以用户输入的值可以被实时地反映出来。
在 Django 中,我们需要使用 queryset 来过滤数据。假设我们有一个模型叫做 Book
,它有一个字段叫做 title
。我们可以用以下代码来定义一个视图(view)函数来搜索这些书籍:
from django.db.models import Q
from django.views import generic
from .models import Book
class BookSearchView(generic.ListView):
model = Book
template_name = 'book/search_results.html'
def get_queryset(self):
query = self.request.GET.get('q')
queryset = super().get_queryset()
if query:
queryset = queryset.filter(
Q(title__icontains=query)
)
return queryset
这个视图函数定义了一个 BookSearchView
类,它继承了 generic.ListView
。这意味着它将会渲染 book/search_results.html
模板和 Book 模型的查询结果。
在视图函数中,get_queryset
方法被用来处理查询。它从 GET 请求中获取关键字,使用 Q
对象来构建查询条件。可以根据需要定制查询条件。
对于这个搜索栏,我们需要将表单提交的查询关键字传递给视图函数。在模板中,我们可以这样引用 SearchBar 组件:
<form action="{% url 'book-search' %}" method="get">
<input name="q" type="text" />
<button type="submit">搜索</button>
</form>
{% with books=object_list %}
{% include 'book/book_list.html' %}
{% endwith %}
在表单中,我们创建了一个 name 为 "q" 的输入框,并把它的值作为 GET 请求的参数。当用户点击提交按钮时,它将会触发搜索功能。
在模板中,我们使用 object_list 变量来表示视图函数的查询结果。我们可以在 book_list.html 模板中使用这个变量来显示搜索结果。
通过本篇文章,我们学习了如何使用 React 和 Django 制作一个搜索栏。我们使用了 React hooks 来捕捉用户的输入,使用 Django 的视图函数和查询集来处理搜索请求。如果你希望搜索功能更加强大,你可以使用其他 Django 库来处理自然语言搜索、拼写纠错等操作。