/ / Djangoで適切な検索機能を作成する-django、検索

Djangoで適切な検索機能を作成する - django、検索

私は許可する検索機能を作成しようとしていますインスタンスにオブジェクトの値を入力して、そのインスタンスとそのいくつかのオブジェクトを検索ページと同じページに表示できるようにします。

#models.py

class Student(models.Model):
# STEP 1 BASIC INFO
student_id = models.CharField(max_length=128, unique=True)
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
ssn = USSocialSecurityNumberField(null=False)
gender = models.CharField(max_length=128, choices=GENDER_CHOICES)
dob = models.DateField(auto_now=False, auto_now_add=False, db_column="date of birth")
contact_number = models.CharField(max_length=128)
address = models.CharField(max_length=128)
city = models.CharField(max_length=128)
state = USStateField(choices=STATE_CHOICES, default="NJ")
zipcode = USZipCodeField(blank=True)
country = CountryField(default="US", blank=True)
home_phone = models.CharField(max_length=128)
cell_phone = models.CharField(max_length=128)
email = models.EmailField(max_length=254, validators=[validate_email])

def __str__(self):
return self.first_name + self.last_name

#views.py

def search_Student(request):
context_dict = {}
if request.method == "POST":
query = request.POST["last_name_search"]
results = Student.objects.filter(last_name=query)
if query:
context_dict["results"] = results
else:
context_dict["no_results"] = query
return render(request, "students/search_student.html", context_dict)

#search_student.html

{% block main_content %}
<form method="post" action="/students/search_student/">
{% csrf_token %}
<label for="last_name_search">Last Name:</label>
<input type="text" name="last_name_search" id="last_name_search">
<input type="submit" name="submit">
</form>
<div id="result_panel">
{% if no_results %}
No results returned for <q>{{ no_results }}</q>
{% else %}
{% for result in results %}
{{ result.last_name }}
{% endfor %}
{% endif %}
</div>
{% endblock %}

#urls.py

urlpatterns = [
url(r"^$", students_views.Students, name="students"),
url(r"^add_student/$", students_views.add_Student, name="add_student"),
url(r"^id=(?P<identify>[w]+)/add_studentcourse/$", students_views.add_StudentCourse, name="add_studentcourse"),
url(r"^id=(?P<identify>[w]+)/add_studentemployment/$", students_views.add_StudentEmployment, name="add_studentemployment"),
url(r"test/$", students_views.test, name="test"),
#URL for the search page.
url(r"^search_student/$", students_views.search_Student, name="search_student"),
url(r"^current_student/$", students_views.current_Student, name="current_student"),
url(r"^all_my_student/$", students_views.all_My_Student, name="all_my_student"),
url(r"^public_student/$", students_views.public_Student, name="public_student"),
url(r"^sales_reports/$", students_views.sales_Reports, name="sales_reports"),
url(r"^switch_counselor/$", students_views.switch_Counselor, name="switch_counselor"),
url(r"^source_admin/$", students_views.source_Admin, name="source_admin"),
url(r"^super_tool/$", students_views.super_Tool, name="super_tool"),
url(r"^help_and_settings/$", students_views.help_And_Settings, name="help_and_settings"),
]

基本的に、入力に姓を入力すると、それと同じ姓を持つすべてのモデルインスタンスを取得し、名前、性別、住所など、一致するすべてのインスタンスについて必要な情報をまったく同じページに配置できるようにする検索。 POSTメソッドは紛らわしいかもしれませんが、誰かがこれを行うと主張します(メソッドをGETに変更しても機能しませんでした)。誰かがコードのエラーや欠落を指摘してもらえますか?ありがとう。

編集:urls.pyを追加しました。

回答:

回答№1は1
  1. タグからアクションを削除します。ブラウザは同じURLに自動的に投稿します。これにより、リダイレクト、マッピング、またはアップストリームurlconfの問題が排除されます。
  2. つかいます View Source divがCSSまたはJSによって隠されているのとは対照的に、ブラウザで何も返されないことを確認します。
  3. 結果が見つかったことを確認します。

views.py

if query:
results = Student.objects.filter(last_name=query)
if results.count():
context_dict["results"] = results
else:
context_dict["no_results"] = query

テンプレート

<div id="result_panel">
{% if no_results %}
No results returned for <q>{{ no_results }}</q>
{% else %}
{% for result in results %}
{{ result.last_name }}
{% endfor %}
{% endif %}
</div>

上記は空にできないことに注意してください。常に何かを表示する必要があります。表示されない場合は、表示エラーであり、データはそこにあります。ポイント2を参照してください。

「結果なし」の部分が表示されている場合は、djangoシェルでクエリを複製してみてください。

python manage.py shell
>>> from yourapp.models import Student
>>> Student.objects.filter(last_name="what you typed")
>>> Student.objects.filter(last_name__iexact="what you typed")
>>> Student.objects.filter(last_name__icontains="what you typed")
>>> Student.objects.count()

最初の3つのいずれも結果を返さない場合は、タイプミスをしたか、4番に生徒がいないことを示します。


回答№2の場合は0

だから、まだコメントさせてくれないので、ここであなたは実際にdjangoテンプレートのリストのように辞書を扱うことができる(そしてそうなっている)と言うことができます ここに見える。

エラーを投稿してください。何が間違っているのかわかりません。あなたの方法は私のコードにうまく適応するので、私は少し迷っています。

書式設定のための編集:

IEのコンパイル時辞書を作成する必要があります。

context_dict = {
"results": results
}
return render(request, "students/search_student.html", context_dict)

スコープが適切な場所にあるように、ifに必ず戻ってください。ifが見つからない場合は、その旨を示す変数が返されません。

答えにこだわるなら、テンプレートでそれを参照してみてください。

{% for result in results.results %}

辞書には、変数resultsを指す結果エントリがあります。すべてのクエリではなく、現在の例の辞書を反復処理していると思います。


回答№3の場合は0

もちろん、ビューメソッドを使用して、カスタム検索およびテンプレートコードでエラーを見つけようとすることができます。

または、Djangoの事前に構築された機能に依存して、よりDjangoの方法でそれを行うことができます。

Djangoを使う ListView Student Modelオブジェクトを照会して表示します。これにより、ページング、エラー処理、コンテキスト設定が無料で得られます。次のようなStackOverflowの質問をご覧ください https://stackoverflow.com/a/33350839/621690 たとえばコード。

生徒をフィルタリングするコードは get_queryset -または使用できます ジャンゴーフィルター.

使いやすくするために、フォーム入力にSelect2を追加して、オートコンプリート/先読みを可能にすることができます。見る django-select2