在 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 呢?