在Django中过滤的最佳做法

时间:2015-05-19 18:21:33

标签: python django filter

在我的Django应用程序的一个页面中,我有一个页面,只显示表格中的所有员工信息:

像这样:

First Name: Last Name: Age: Hire Date:
Bob         Johnson    21   03/19/2011
Fred        Jackson    50   12/01/1999

现在,我提示用户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)+'/')

代码运行正常,问题是我是网络开发人员的新手,我觉得我并没有以正确的方式完成这项工作。我想使用最佳实践,所以任何人都可以确认我或以正确的方式指导我按日期过滤?

谢谢!

2 个答案:

答案 0 :(得分:2)

你是对的,以这种方式查询你的API有点尴尬。如果您需要将员工姓名和其他内容添加到过滤器中,您将获得一个非常长的URL,并且它不会灵活。

您的过滤器参数(开始日期和结束日期)应作为查询添加到网址中,而不是路径的一部分。
在这种情况下,网址将为employees/employees_by_date/?start_date=xxx&end_date=yyy,并且可以使用start_date = request.GET['start_date]在视图中检索日期。

如果表单与method='get'一起使用,表单中的输入会自动转换为查询并附加在网址的末尾。
如果没有使用表单,则需要使用函数对参数进行编码,以便能够使用\/ $%等特殊字符传递值。

答案 1 :(得分:1)

使用Unix时间戳而不是[\d]+个日期。 unix时间戳是从1970年1月1日起经过的秒数。(“The Epoch”。)所以它只是一个简单的整数。在我写这篇文章时,Unix时间是 1432071354

它们不是人类可读的,但Unix时间戳是明确的,简洁的,可以使用简单的正则表达式mm/dd/yyyy进行过滤。

您会看到网络上有很多API使用它们,例如Facebook。向下滚动到“基于时间的分页”,这些数字是Unix时间戳。

mm/dd/yyyy日期的问题含糊不清。是dd/mm/yyyy(美国)吗?还是mm-dd-yyyy(其他地方)?那么plugins: [ (new (require('less-plugin-clean-css'))({ advanced: true, compatibility: 'ie8' })) ] 呢?