簡體   English   中英

在Django中進行多字段搜索

[英]Making a multiple field search 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 %}

由於某些原因,如果我在課程名稱字段或教師字段中鍵入內容,搜索將起作用,但如果我輸入了多個字段,則搜索將不起作用。 由於某種原因,無論我如何鍵入日期,開始日期字段都將無法使用。 有人可以幫我輸入正確的代碼嗎? 謝謝。

如果可行,請嘗試此操作。

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)

您可以嘗試使用向下鑽取方法進行過濾,以最大程度地減少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”中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM