2017-07-06 134 views
0

我正在嘗試使用對應於不同數據段的三個字段搜索模型對象的搜索頁。這裏是我下面的代碼:在Django中進行多字段搜索

models.py

class Schedules(models.Model): 
    course_name = models.CharField(max_length=128, choices=COURSE_NAME_CHOICES, default='a-plus') 
    start_date = models.DateField(auto_now=False, auto_now_add=False, default=datetime.date.today) 
    instructor = models.CharField(max_length=128, choices=INSTRUCTOR_CHOICES, default='adewale') 

views.py

def search_Schedule(request): 
    context_dict = {} 
    if request.method == 'POST': 
     query1 = request.POST['course_name_search'] 
     query2 = request.POST['start_date_search'] 
     query3 = request.POST['instructor_search'] 
     if query1: 
      results = Schedules.objects.filter(course_name__icontains=query1) 
      if query2: 
       results = results.filter(start_time=query2) 
       if query3: 
        results = results.filter(instructor__icontains=query3) 
        table = ScheduleTable(results) 
        if results.count(): 
         context_dict['table'] = table 
        else: 
         context_dict['no_results'] = query1 + ", " + query2 + ", and " + query3 
       else: 
        table = ScheduleTable(results) 
        if results.count(): 
         context_dict['table'] = table 
        else: 
         context_dict['no_results'] = query1 + " and " + query2 
      elif query3: 
       results = results.filter(start_time__icontains=query3) 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query1 + " and " + query3 
      else: 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query1 
     elif query2: 
      results = Schedules.objects.filter(start_time=query2) 
      if query3: 
       results = results.filter(instructor__icontains=query3) 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query2 + " and " + query3 
      else: 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query2 
     elif query3: 
      results = Schedules.objects.filter(instructor__icontains=query3) 
      table = ScheduleTable(results) 
      if results.count(): 
       context_dict['table'] = table 
      else: 
       context_dict['no_results'] = query3 
    return render(request, "schedule/search_schedule.html", context_dict) 

search_schedule.html

{% block main_content %} 
    <form method="post" action=""> 
     {% csrf_token %} 
     <label for="course_name_search">Course Name:</label> 
     <input type="text" name="course_name_search" id="course_name_search"> 

     <label for="start_date_search">Start Date:</label> 
     <input type="datetime" name="start_date_search" id="start_date_search"> 

     <label for="instructor_search">Instructor:</label> 
     <input type="text" name="instructor_search" id="instructor_search"><br> 
     <input type="submit" name="submit"> 
    </form> 
    <div id="result_panel"> 
     {% if table %} 
      {% render_table table %} 
     {% else %} 
      {% if no_results %} 
       No results returned for <q>{{ no_results }}</q> 
      {% else %} 
       Please enter a search 
      {% endif %} 
     {% endif %} 
{% endblock %} 

出於某種原因,搜索將工作,如果我輸入課程名稱字段或教師字段,但如果我輸入多個字段則不起作用。由於某種原因,無論我如何輸入日期,開始日期字段都不會工作。有人可以幫我用正確的方式輸入代碼嗎?謝謝。

回答

0

試試這個,如果它的工作。

def search_Schedule(request): 
context_dict = {} 
if request.method == 'POST': 
    query1 = request.POST.get('course_name_search',None) 
    query2 = request.POST.get('start_date_search',None) 
    query3 = request.POST.get('instructor_search',None) 
    if query1: 
     results = Schedules.objects.filter(course_name__icontains=query1) 
     if query2: 
      results = results.filter(start_time=datetime.datetime.strptime(query2, "%d%m%Y").date()) 
      if query3: 
       results = results.filter(instructor__icontains=query3) 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query1 + ", " + query2 + ", and " + query3 
      else: 
       table = ScheduleTable(results) 
       if results.count(): 
        context_dict['table'] = table 
       else: 
        context_dict['no_results'] = query1 + " and " + query2 
     elif query3: 
      results = results.filter(instructor__icontains=query3) #changed this filter condition 
      table = ScheduleTable(results) 
      if results.count(): 
       context_dict['table'] = table 
      else: 
       context_dict['no_results'] = query1 + " and " + query3 
     else: 
      table = ScheduleTable(results) 
      if results.count(): 
       context_dict['table'] = table 
      else: 
       context_dict['no_results'] = query1 
    elif query2: 
     results = Schedules.objects.filter(start_time=datetime.datetime.strptime(query2, "%d%m%Y").date()) 
     if query3: 
      results = results.filter(instructor__icontains=query3) 
      table = ScheduleTable(results) 
      if results.count(): 
       context_dict['table'] = table 
      else: 
       context_dict['no_results'] = query2 + " and " + query3 
     else: 
      table = ScheduleTable(results) 
      if results.count(): 
       context_dict['table'] = table 
      else: 
       context_dict['no_results'] = query2 
    elif query3: 
     results = Schedules.objects.filter(instructor__icontains=query3) 
     table = ScheduleTable(results) 
     if results.count(): 
      context_dict['table'] = table 
     else: 
      context_dict['no_results'] = query3 
return render(request, "schedule/search_schedule.html", context_dict) 
0

你可以嘗試爲您篩選向下鑽取的方法來你的if語句最小化:

course_name_search = request.POST.get('course_name_search', None) 
start_date_search = request.POST.get('start_date_search', None) 
instructor_search = request.POST.get('instructor_search', None) 

queryset = Schedules.objects.all() 

if course_name_search: 
    queryset = queryset.filter(course_name__icontains=course_name_search) 
if start_date_search: 
    queryset = queryset.filter(start_date=start_date_search) 
if instructor_search: 
    queryset = queryset.filter(instructor__icontains=instructor_search) 

# if none of the search params were filled in then return none 
if not course_name_search and not start_date_search and not instructor_search: 
    queryset = Schedules.objects.none() 

但這裏的幾個注意事項,以及一些事來幫助您的問題與起始日期,因爲你正在讀取POST數據,您需要在查詢之前將start_date_search轉換爲實際日期。

另一件可以幫助你的事情是使用GET代替POST,然後你可以在模板中讀入以填寫你現在填入'no_results'的選定值。

+0

沒關係,我設法解決它。好像我在字段中輸入錯誤的東西。 –