2017-07-06 4 views
0

Ich versuche, eine Suchseite zu erstellen, die nach Modellobjekten sucht, wobei drei Felder verwendet werden, die verschiedenen Datenelementen entsprechen. Hier ist mein Code unten:Erstellen einer Suche nach mehreren Feldern in 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 %} 

Aus irgendeinem Grund wird die Suche arbeiten, wenn ich Geben Sie das Feld für den Kursnamen oder das Feld "Instructor" ein, aber es funktioniert nicht, wenn ich mehr als ein Feld eintippe. Und aus irgendeinem Grund wird das Startdatumsfeld nicht funktionieren, egal wie ich das Datum eintippe. Kann mir jemand bei der korrekten Eingabe des Codes helfen? Vielen Dank.

Antwort

0

versuchen Sie dies, wenn es funktioniert.

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

könnten Sie versuchen, eine Drill-Down-Methode für Ihre Filterung Ihres zu minimieren, wenn Aussagen:

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

Aber ein paar Einsprüche hier, und etwas, das Ihr Problem mit den Startdaten zu helfen, da Sie Wenn Sie die POST-Daten direkt lesen, müssen Sie Ihre start_date_search in ein aktuelles Datum vor der Abfrage konvertieren.

Die andere Sache, die Ihnen helfen wird, ist möglicherweise besser, ein GET anstelle eines POST zu verwenden, das Sie dann in der Schablone lesen können, um die gewählten Werte zu füllen, die Sie jetzt in die 'no_results' füllen.

+0

Macht nichts, ich schaffte es, es zu lösen. Es scheint, als hätte ich auf den Feldern die falschen Dinge eingegeben. –

Verwandte Themen