我正在尝试搜索并在数据库中的两个日期之间列出,但不知道该怎么做?
models.py
...
class ProductsTbl(models.Model):
created = models.DateTimeField(editable=False)
...
views.py
def search(request):
error = False
if 'q1' and 'q2'in request.GET:
q = request.GET['q1','q2']
if not q:
error = True
else:
books = ProductsTbl.objects.filter(created__range=q)
return render(request, 'search_results.html',
{'books': books, 'query': q})
return render(request, 'search_form.html', {'error': error})
我已查询stackoverflow here,但不明白该怎么做
我在models.py中再添加一个DateTimeField以帮助搜索??
实际上我可以在python manage.py shell中完成它,但是我怎样才能让它在网络上运行?
我的
search_form.html
<form action="" method="get">
<table style="width:30%">
<tr>
<td><input type="text" class="datepicker" name="q1"> </td>
<td style="width:5%"> between </td>
<td><input type="text" class="datepicker" name="q2"></td>
<br>
<td><input type="submit" value="Search"></td>
</tr>
</table>
</form>
search_results.html
{% if books %}
<p>Found {{ books|length }} product{{ books|pluralize }}.</p>
<ul>
{% for book in books %}
<li>{{ book.created }}</li>
<h2><a href="{% url 'thing_detail' slug=book.slug %}">{{ book.name }}</a></h2>
{% endfor %}
</ul>
{% else %}
<p>No products matched your search criteria.</p>
{% endif %}
如果仅过滤一个日期,我可以使用此
views.py
def publish(request):
error = False
if 'q' in request.GET:
q = request.GET['q']
if not q:
error = True
else:
books = ProductsTbl.objects.filter(release__icontains=q)
return render(request, 'publish_results.html',
{'books': books, 'query': q})
return render(request, 'publish_form.html', {'error': error})
然而,,,当两个日期范围之间,但我不知道该怎么做
答案 0 :(得分:3)
你几乎就在那里,你只需要正确使用__range测试。
首先,将字符串转换为日期时间,例如:
import datetime
date_from = datetime.datetime.strptime(request.GET['q1'], '%Y-%m-%d')
date_to = datetime.datetime.strptime(request.GET['q2'], '%Y-%m-%d')
这里的挑战是确保字符串的格式正确(例如我已经使用过&#39;%Y-%m-%d&#39;在我上面的例子中,例如&#39; 2016年4月22日&#39;。)
第二次,屏幕截图中显示的错误是因为您创建的日期时间没有指定时区,但数据库中的值确实有时区。 Python显示错误,因为它无法比较两者。
您可以在documentation和this answer here中了解相关信息。
最后,按以下方式应用范围:
books = ProductsTbl.objects.filter(created__range=(date_from, date_to))
答案 1 :(得分:1)
使用此查询获取两个日期范围的结果...
首先从搜索查询字符串中获取两个日期并在此处应用。
ProductsTbl.objects.filter(created__range=["2016-04-06", "2016-08-30"])
答案 2 :(得分:0)
views.py
def search(request):
error = False
if 'q1' and 'q2'in request.GET:
q1 = request.GET['q1']
q2 = request.GET['q2']
if not q1:
error = True
elif not q2:
error = True
else:
books = ProductsTbl.objects.filter(created__range=(q1,q2))
return render(request, 'search_results.html',
{'books': books })
return render(request, 'search_form.html', {'error': error})
现在我可以过滤并列出范围日期