【问题标题】:Making a multiple field search in Django在 Django 中进行多字段搜索
【发布时间】:2017-07-06 17:58:01
【问题描述】:

我正在尝试创建一个搜索页面,该页面使用与不同数据对应的三个字段来搜索模型对象。下面是我的代码:

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 %}

出于某种原因,如果我在课程名称字段或讲师字段中输入,搜索将有效,但如果我输入多个字段,则搜索将无效。并且由于某种原因,无论我如何输入日期,开始日期字段都将不起作用。有人可以帮助我输入代码的正确方法吗?谢谢。

【问题讨论】:

    标签: python django search


    【解决方案1】:

    如果可行,试试这个。

    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)
    

    【讨论】:

      【解决方案2】:

      您可以尝试向下钻取方法进行过滤,以尽量减少您的 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”中的所选值。

      【讨论】:

      • 没关系,我设法解决了。好像我在字段中输入了错误的内容。
      猜你喜欢
      • 2014-12-25
      • 2019-01-26
      • 2012-01-13
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多