你没能解释“我很难让它正常工作”的真正含义,所以这最多只能算是一个局部的、有点“胡乱猜测”的答案,但无论如何:
首先,您需要使用正确的HTTP方法将字段和submit放入一个标记中,并且您的字段“name”属性(而不是“id”属性)必须与您在视图中查找的内容相匹配:
Select time period:
From:
To:
还要注意,我们用{{ start_date }}和{{ end_date }}-在模板的上下文中,data是Queryset,没有start_date或{}属性。在
然后在您的视图中,您必须正确使用request.GET.get():
^{pr2}$
.get()是一个方法,必须调用它,而不是下标(parens,而不是方括号)。请注意,在用户实际提交表单之前,这些字段将不在querystring中,GET.get(...)将返回None,因此您必须处理这种情况,要么为.get()提供默认值,要么测试表单是否已提交,根本不返回queryset(或返回空的queryset,或者返回整个未过滤的查询集等,由您选择)。这是一个返回空查询集的版本。在
另外,由于您没有使用Djangoforms.Form,因此您将得到未初始化的原始字符串,而Queryset.filter()需要Pythondatetime.date或{}对象,因此您必须手动验证和转换这些值:# ...
parsed_start_date = None
parsed_end_date = None
if start_date and end_date:
errors = {}
try:
parsed_start_date = datetime.datetime.strptime(start_date, "%d/%m/%Y")
except ValueError:
errors["start_date"] = "Invalid date" # etc..
try:
parsed_end_date = datetime.datetime.strptime(end_date, "%d/%m/%Y")
except ValueError:
errors["end_date"] = "Invalid date" # etc..
if parsed_start_date and parsed_end_date:
data = Data.objects.filter(date__range=[parsed_start_date, parsed_end_date])
else:
data = Data.objects.none() # empty queryset
context = {
'data': data,
'errors': errors,
'start_date': start_date,
'end_date': end_date
}
# etc
然后必须更改模板以适应这些更改(不要尝试将|date筛选器应用于字符串,显示错误…):
Select time period:
From:
{% if errors.start_date %}
{{ errors.start_date }}
{% endif %}
To:
{% if errors.end_date %}
{{ errors.end_date }}
{% endif %}
请注意,using a Django form将使其不那么痛苦(也更健壮)。在
你对Python似乎也不是很精通。Django是一个非常方便的pythonweb框架,但它仍然要求您至少具备HTTP、HTML和python的基本知识。如果你想完成任何事情,我建议你花点时间学习这些主题。在