【问题标题】:Best practices to filter in Django在 Django 中过滤的最佳实践
【发布时间】:2015-05-20 05:40:39
【问题描述】:

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

像这样:

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)+'/')

代码运行良好,问题是我是网络开发新手,感觉我没有以正确的方式完成此任务。我想使用最佳做法,所以任何人都可以确认我是或指导我以正确的方式按日期过滤吗?

谢谢!

【问题讨论】:

    标签: python django filter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      使用 Unix 时间戳而不是 mm/dd/yyyy 日期。 unix 时间戳是从 1970 年 1 月 1 日起经过的秒数。(“时代”。)所以它只是一个简单的整数。在我写这篇文章时,Unix 时间是 1432071354。

      它们不是人类可读的,但 Unix 时间戳是明确、简洁的,并且可以使用简单的正则表达式 [\d]+ 进行过滤。

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

      mm/dd/yyyy 日期的问题是含糊不清。是mm/dd/yyyy(美国)吗?或dd/mm/yyyy(其他地方)? mm-dd-yyyy 呢?

      【讨论】:

        猜你喜欢
        • 2019-11-30
        • 2018-12-06
        • 2014-05-23
        • 2015-11-16
        • 2013-02-04
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 2016-04-30
        相关资源
        最近更新 更多