2017-07-06 98 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

没关系,我设法解决它。好像我在字段中输入错误的东西。 –