更新に同期させるように関わるのサンプルコードファイル、HelloGitHub-チーム倉庫
検索は、複雑な関数であるが、いくつかの簡単な検索タスクのために、我々は完全に提供されるいくつかの組み込みの方法Djangoのモデルレイヤを使用することができます。今、私たちは私たちのブログのためのシンプルな検索機能を提供します。
アウトライン
ブログの記事は、通常、二つの部分のタイトルと本文が含まれています。ユーザーが検索するキーワードを入力すると、我々は、ユーザーがタイトルを表示したいと本文テキストは、すべての記事の検索キーワードが含まれています。検索次のように全体のプロセスは次のとおりです。
- 検索ボックスにユーザーの要素を検索キーワード、「ジャンゴ」とし、その後、ユーザーがサーバーにその入力の結果を提出するために、検索ボタンをクリックします。
- サーバーは、記事のタイトルとキーワードの体内に含まれるすべての記事を検索するために「ジャンゴ」データベースの後に、ユーザ入力された検索キーワードを受け取ります。
- サーバーは、ユーザーにクエリ結果を返します。
全体のプロセスは、Djangoはこれらのプロセスを実装する使用方法で見てみましょう、そうです。
キーワードは、サーバーに送信されます
Djangoのブログポスト(記事)モデルでの私たちの最初の一見:
blog/models.py
class Post(models.Model):
# 标题
title = models.CharField("标题", max_length=70)
# 正文
body = models.TextField("正文")
# 其他属性...
def __str__(self):
return self.title
私たちはブログの検索フォームのようなものを行ってきましたHTMLフォームのコードをユーザーに提供したいので、最初のステップを参照するには、ユーザーは、検索ボックスに検索キーワードを入力します:
templates/base.html
<form role="search" method="get" id="searchform" action="{% url 'blog:search' %}">
<input type="search" name="q" placeholder="搜索" required>
<button type="submit"><span class="ion-ios-search-strong"></span></button>
</form>
ここでは特別な注意<input type="search" name="q" placeholder="搜索" required>
ユーザーが入力を使用して検索を入力してフォームを送信name属性は、データのタイプは、キーと値のペアの形式でサーバーに送信されますが、このキーの名前は、name属性で指定されています。そこで、サーバは、名前の値に基づいて、ユーザー入力を取得できること。
ユーザーはキーワード検索を入力し、検索ボタンをクリックした後、データはDjangoのバックエンドサーバに送信されます。フォームは、action
{%のURLのブログ:検索'です %} 属性(私たちは、このビュー機能を記述していないが)、その結果は、ユーザーがURLを対応するブログ検索アプリケーションビュー機能に送信されるように提出することを示しています。
検索キーワードを含む記事を検索
検索ビュー機能を提供します検索機能は、コードがブログ/ views.py中に書かれています:
blog/views.py
from django.contrib import messages
def search(request):
q = request.GET.get('q')
if not q:
error_msg = "请输入搜索关键词"
messages.add_message(request, messages.ERROR, error_msg, extra_tags='danger')
return redirect('blog:index')
post_list = Post.objects.filter(Q(title__icontains=q) | Q(body__icontains=q))
return render(request, 'blog/index.html', {'post_list': post_list})
まず、使用request.GET.get('q')
取得したユーザが送信した検索キーワードを。私たちが保存されるデータは、ユーザーのgetメソッドDjangoのフォームが提出したrequest.GET
私たちが使うので、これは、オブジェクトPythonの辞書に似て、get
辞書に対応するキー値qから取られた方法、すなわち、ユーザーの検索キーワードを。検索ボックスの入力における当社のフォームのname属性の値は、name属性の値を変更する場合は、キーの名前がそれに応じて改正する必要があり、Qであるため、ここで辞書をqと呼ばれていたキーです。
ユーザーは、我々はクエリを実行する必要はありません検索キーワードを入力して、フォームを送信しない場合、我々は、少しチェックをした、私たちはここにDjangoのメッセージアプリケーションを使用して、エラーメッセージのリマインダを与えるようにユーザーに送るもので交流ブリッジ:コメント機能話で。その後、ユーザーはホーム・ページにリダイレクトされます。ここでのリダイレクト機能もそのチュートリアルで話されています。
ユーザーはキーワード検索を入力した場合、我々は通過しfilter
、すべてのデータベースの記事の資格からメソッドをフィルタリング。フィルタリングの基準はここにあるtitle__icontains=q
キーワードのq(含まれている)そのタイトルが含まれている、私はプレフィックスは大文字と小文字を区別しないで表します。ここではicontains
、クエリ式(フィールドの照合は)私たちは、他の類似したクエリ式を使用していた前に、その使用をスクリーニングするプロパティモデルの後に2つのアンダースコアと一致している、です。Djangoはクエリ式の多くを建て、出会い関連のニーズがクエリ文書の使用にすばやく移動することができた後、公式のDjangoのルックスを越えると、各表現の役割を理解することが推奨され、フィールドのルックアップ。
Qオブジェクト:加えて、我々はここでdjango.db.modelsからから新しいものを導入しました。オブジェクトをパッケージ化するためのQクエリ式は、その役割は、複雑なクエリロジックを提供することです。ここでは、例えば、Q(title__icontains=q) | Q(body__icontains=q)
タイトル(タイトル)qはキーワード含有表し又はキーワードQ、ロジック、又は用い含むテキスト(本体)|
のシンボルを。あなたはQオブジェクトのみを書き込むことができていない場合title__icontains=q, body__icontains=q
、それは見出し(タイトル)Qなったキーワード含めるとキーワードのqを含むテキスト(本体)、それは我々が何をしたいの目的ではありません。
バインディングのURL
リアビュー機能では、次のように、URLに対応するビュー機能をマッピングすることを忘れないでください。
blog/urls.py
urlpatterns = [
# 其他 url 配置
path('search/', views.search, name='search'),
]
ナビゲーションバーで行われ、いくつかのキーワードを入力して効果を見てみて!
もちろん、この検索機能は非常に簡単です、いくつかの複雑な検索要件を満たすことは困難です。検索エンジンを書くことは、大きなプロジェクトですが、幸い私たちのためにすべての作業を完了するために、このサードパーティのアプリをジャンゴ - 干し草の山。これで、私たちは、このようなフルテキスト検索関連度順に並べ替え、検索、キーワードの強調表示、および非常に強力であるBaiduの検索機能の機能に非常に似たような、より洗練された検索機能を、達成することができます。もちろん、それは使用に複雑になる、次のチュートリアルでは、ジャンゴ・干し草の山併用Elasticsearchの検索エンジンをご紹介します。
「オープンソース・プロジェクトシリーズの説明」 -オープンソース・プロジェクトに興味がある人は、もはや恐れている聞かせていないスポンサーのオープンソースプロジェクトは、もはや一人でいる聞かせしないように。私たちの記事に従ってください、あなたはプログラミングの楽しさ、オープンソースプロジェクトの使用を発見し、簡単なので、関与することが判明します。ウェルカムメッセージが私達に連絡して、より多くの人々は、オープンソース、オープンソースの貢献〜と恋に落ちるように、私たちに参加