我正在尝试创建一个搜索页面,使用与不同数据对应的三个字段来搜索模型对象。以下是我的代码:
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 :(得分: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)
答案 1 :(得分: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可能会更好,然后你可以在模板中阅读,以填写你现在填入&#39; no_results&#的所选值39;