在 Django 中过滤的最佳实践
Best practices to filter in Django
在我的 Django 应用程序的一个页面中,我有一个页面只显示 table:
中的所有员工信息
像这样:
First Name: Last Name: Age: Hire Date:
Bob Johnson 21 03/19/2011
Fred Jackson 50 12/01/1999
现在,我提示用户输入 2 个日期,我想知道是否在这 2 个日期之间雇用了员工。
对于 HTTP GET,我只呈现页面,对于 HTTP POST,我发送一个 URL,其中包含 URL.
中的变量
我的 urls.py 文件有这些模式:
('^employees/employees_by_date/$','project.reports.filter_by_date'),
('^employees/employees_by_date/sort/(?P<begin_date>\d+)/(? P<end_date>\d+)/$', EmployeesByDate.as_view()),
我的 filter_by_date 函数如下所示:
def filter_by_date(request):
if request.method == 'GET':
return render(request,"../templates/reports/employees_by_date.html",{'form':BasicPrompt(),})
else:
form = BasicPrompt(request.POST)
if form.is_valid():
begin_date = form.cleaned_data['begin_date']
end_date = form.cleaned_data['end_date']
return HttpResponseRedirect('../reports/employees_by_date/sort/'+str(begin_date)+'/'+str(end_date)+'/')
代码运行良好,问题是我是网络开发新手,感觉我没有以正确的方式完成这项工作。我想使用最佳实践,所以任何人都可以确认我是或指导我以正确的方式按日期过滤吗?
谢谢!
你说得对,这样查询你的API有点尴尬。如果您需要将员工姓名和其他内容添加到过滤器,您最终会得到一个很长的 URL 并且它不灵活。
您的过滤器参数(开始和结束日期)应作为查询添加到 url 中,而不是路径的一部分。
在这种情况下,url 将是 employees/employees_by_date/?start_date=xxx&end_date=yyy
并且可以使用 start_date = request.GET['start_date]
在视图中检索日期。
如果表单与 method='get'
一起使用,表单中的输入将自动转换为查询并附加在 url.
的末尾
如果不使用任何形式,则需要使用函数对参数进行编码,以便能够传递具有特殊字符的值,例如 \/ $%
.
使用 Unix 时间戳而不是 mm/dd/yyyy
日期。 unix 时间戳是从 1970 年 1 月 1 日起经过的秒数。("The Epoch"。)所以它只是一个简单的整数。在我写这篇文章时,Unix 时间是 1432071354。
它们的可读性不高,但 Unix 时间戳明确、简洁,可以使用简单的正则表达式 [\d]+
.
进行过滤
您会看到网络上有很多 API 使用它们,例如 Facebook。向下滚动到 "time based pagination",这些数字是 Unix 时间戳。
mm/dd/yyyy
日期的问题是歧义。是 mm/dd/yyyy
(美国)吗?或 dd/mm/yyyy
(其他地方)? mm-dd-yyyy
呢?
在我的 Django 应用程序的一个页面中,我有一个页面只显示 table:
中的所有员工信息像这样:
First Name: Last Name: Age: Hire Date:
Bob Johnson 21 03/19/2011
Fred Jackson 50 12/01/1999
现在,我提示用户输入 2 个日期,我想知道是否在这 2 个日期之间雇用了员工。
对于 HTTP GET,我只呈现页面,对于 HTTP POST,我发送一个 URL,其中包含 URL.
中的变量我的 urls.py 文件有这些模式:
('^employees/employees_by_date/$','project.reports.filter_by_date'),
('^employees/employees_by_date/sort/(?P<begin_date>\d+)/(? P<end_date>\d+)/$', EmployeesByDate.as_view()),
我的 filter_by_date 函数如下所示:
def filter_by_date(request):
if request.method == 'GET':
return render(request,"../templates/reports/employees_by_date.html",{'form':BasicPrompt(),})
else:
form = BasicPrompt(request.POST)
if form.is_valid():
begin_date = form.cleaned_data['begin_date']
end_date = form.cleaned_data['end_date']
return HttpResponseRedirect('../reports/employees_by_date/sort/'+str(begin_date)+'/'+str(end_date)+'/')
代码运行良好,问题是我是网络开发新手,感觉我没有以正确的方式完成这项工作。我想使用最佳实践,所以任何人都可以确认我是或指导我以正确的方式按日期过滤吗?
谢谢!
你说得对,这样查询你的API有点尴尬。如果您需要将员工姓名和其他内容添加到过滤器,您最终会得到一个很长的 URL 并且它不灵活。
您的过滤器参数(开始和结束日期)应作为查询添加到 url 中,而不是路径的一部分。
在这种情况下,url 将是 employees/employees_by_date/?start_date=xxx&end_date=yyy
并且可以使用 start_date = request.GET['start_date]
在视图中检索日期。
如果表单与 method='get'
一起使用,表单中的输入将自动转换为查询并附加在 url.
的末尾
如果不使用任何形式,则需要使用函数对参数进行编码,以便能够传递具有特殊字符的值,例如 \/ $%
.
使用 Unix 时间戳而不是 mm/dd/yyyy
日期。 unix 时间戳是从 1970 年 1 月 1 日起经过的秒数。("The Epoch"。)所以它只是一个简单的整数。在我写这篇文章时,Unix 时间是 1432071354。
它们的可读性不高,但 Unix 时间戳明确、简洁,可以使用简单的正则表达式 [\d]+
.
您会看到网络上有很多 API 使用它们,例如 Facebook。向下滚动到 "time based pagination",这些数字是 Unix 时间戳。
mm/dd/yyyy
日期的问题是歧义。是 mm/dd/yyyy
(美国)吗?或 dd/mm/yyyy
(其他地方)? mm-dd-yyyy
呢?