2015-11-19 41 views
0

所以,我在下面按日期过滤。但是,如何让用户通过网址控制日期范围。因此,举例来说:使用Django视图和模板通过url参数控制过滤日期范围?

http://fakeurl.net/?start=10-1-15&end=10-5-15 

,用户可以更改参数的URL之间有什么日期范围内的对象将显示在网站上决定。这是我的观点:

class FakeView(View): 
    def get(self, request, *args, **kwargs): 
    template = "fake.html" 

    stuff = ObjectName.objects.all().order_by('approved') 
    number_of_stuff = request.GET.get('number_of_stuff, default="10") 

    start = datetime.date(2010, 1, 1) 
    end = datetime.date(2020, 1, 1) 
    stuff = ObjectName.objects.filter(created__range=(start, end)) 

    return render(request, template, {'stuff': stuff, 'number_of_stuff': number_of_stuff}) 

这里是什么在我的模板:

{% for stuff in stuff|dictsortreversed:"created"|slice:number_of_stuff %} 
       {{ stuff.whatever }} 
    <% endfor %> 

我需要日期范围做花药request.GET.get()?我如何在开始和结束之间分解它?它将如何整合到模板中?

想通了: 所以,这是没有任何幻想,但我的目的,将正常工作:

end_date = request.GET.get('end_date', default="2100-1-1") 
    start_date = request.GET.get('start_date', default="1850-1-1") 

    stuff = Stuff.objects.filter(approved__range=(start_date, end_date)) 

然后就是通过开始和结束日期变量来渲染功能

+0

我不确定从request.GET获取原始数据是否安全。如果用户在日期值中出错,该怎么办?像?end_date = 2015-05-112。我仍然建议移动捕获GET属性的代码,验证它们,将其转换为适当的python类型并将默认值设置为表单代码。 – Nick

回答

0

您应该使用Django表单来捕获和验证日期过滤的“开始”和“完成”。

所以只需添加一个简单的表格:

from django import forms 

class DateFilterForm(forms.Form): 
    start = forms.DateField() 
    finish = forms.DateField() 

然后在你看来只是通过您获取属性以这种形式:

... 
form = DateFilterForm(request.GET) 
if not form.is_valid(): 
    # here goes either some error handling or setting default filter values 
else: 
    start = form.cleaned_data['start'] 
    finish = form.cleaned_data['finish'] 
... 

在你的模板,您可以使用相同的表格和自定义启动并用jquery datepicker插件完成字段。

+0

是的,但是,对于这种情况,我没有使用表格... –

+0

@MichaelSebastian您应该仍然使用它进行验证,而无需将其放入模板中。 – Nick

+0

好的谢谢 - 我想这将发布我的答案 –