2017-06-28 14 views
0

我試圖做一個搜索功能,允許我在一個實例中輸入一個對象的值,這樣我就可以在搜索的同一頁面上顯示該實例和它的幾個對象頁。這是我到目前爲止有:在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.

+0

第一個錯誤是,您正在從您的視圖發送字典,並試圖將其視爲模板中的列表。 –

+0

你可以把你遇到的錯誤? –

+0

@ArpitSolanki它不是應該是一個列表,考慮到它正在採取一堆匹配的結果? –

回答

1

如何調試這個

  1. 取下標籤的動作。瀏覽器將自動發佈到相同的URL。這排除了重定向,映射或上游urlconf的任何問題。
  2. 在瀏覽器中使用View Source以確保沒有返回任何東西,而不是CSS被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 shell:

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() 

如果沒有前三個返回結果,那麼你犯了一個錯字或4號會顯示你沒有學生。

+0

帶有context_dict ['no_results'] = last_name的行會造成混淆,因爲last_name被視爲錯誤。 –

+0

我的不好,修復。固定。而事實上,你打它,說了很多:) – Melvyn

+0

我的搜索頁面仍然沒有顯示結果。我認爲其餘的觀點應該是什麼樣子?我應該將方法更改爲GET,因爲我被告知不應該。 –

0

SO不會讓我評論相當尚未,所以在這裏說,你的確可以(而且)應該把類型的字典像Django範本seen here.

能否請您發表您的錯誤列表?我不確定我看到了什麼錯誤。你的方法適應了我的代碼,所以我有點失落。

編輯的格式:

你也許應該做一個編譯時字典,IE:

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

確保在如果返回,因此範圍是在正確的地方,如果你的如果發現沒有返回一個變量這樣說。

如果你執意堅持你的答案,試圖在模板中引用它作爲這樣..

{% for result in results.results %} 

你的字典裏有一個結果項,指向不同的結果。我相信你正在遍歷當前例子中的字典,而不是所有的查詢。

+0

控制檯中沒有可見的錯誤。我點擊搜索按鈕後,搜索結果將不會顯示在搜索頁面中。在這種情況下,搜索頁面將不會顯示通過過濾的實例的姓氏。 –

+0

很少有東西需要查看,是在settings.py中註冊的應用程序?是否有任何信息需要實際查詢? 如果兩者都可以,爲了縮小範圍,我會遵循Shockwave Moto的建議,除非您的返回需要在if語句中發生,並且如果您沒有找到查詢,那麼返回一個頁面,說它找不到任何內容。或者具有相同消息的變量。 –

+0

查看我的帖子以獲得更新的答案。 –

0

當然,您可以使用視圖方法並嘗試在自定義搜索和模板代碼中找到錯誤。

或者你可以做一個更Django的方式,依靠的Django的預建功能:

使用Django的ListView來查詢並顯示學生模型對象。你可以免費獲得分頁,錯誤處理,上下文設置。有關示例代碼,請參閱其他StackOverflow問題,如https://stackoverflow.com/a/33350839/621690

您對代碼進行過濾的代碼將進入get_queryset - 或者您可以使用django-filter

爲了更好的可用性,您可以將Select2添加到允許自動完成/預測的表單輸入中。見django-select2