通过网址发送日期字段,过滤项目

时间:2015-05-19 16:38:29

标签: django

我正在制作一个基本发票系统,我在其中创建了结算周期和项目。我选择和项目,当它“买”,然后我想按照它们应用的月份过滤项目。我是Django的新手,我似乎无法弄清楚如何设置URL。这是我到目前为止爬过文档的内容。

## urls.py
url(r'^invoice/invoice-list/(P<year>[0-9]{4})-(?P<month>[-\w]+)-(p<year>[0-9]{4})-(p<month>[-\w]+)', 'invoices.views.InvoiceDetail', name='invoice-detail')



## invoice-list.html
{% for period in bill_period %}
   <li> <a href="{% url 'invoice-detail' period.start_date|date:"F Y" period.end_date|date:"F Y" %}">{{ period.start_date | date }} - {{ period.end_date | date}}</a></li>
{% endfor %}



## views.py
@login_required
def invoicelist(request):
    p = Bill_Period.objects.filter()
    return render_to_response('invoice-list.html', {'bill_period': p})

def InvoiceDetail(request, id=id):
    invoice_details = invoice.objects.filter(date_of_service__range=(period.start_date, period.end_date))
    current_user = request.user
    context = {'invoice_details': invoice_details}
    return render(request, 'invoice-detail.html', context)

1 个答案:

答案 0 :(得分:0)

首先,您的URL正则表达式是错误的;命名组yearmonth重复两次。我猜你想把其中两个变成dateid

在URL正则表达式中使用命名组时,这些命名组将作为附加参数传递给视图。因此,一旦您更正了URL,您的InvoiceDetail函数(注意:pep8建议将函数名称的小写和下划线)称为InvoiceDetail(request, year, month, date, id)

从那时起,您可以使用年,月,日的值来过滤发票。

但是,您可以做出一些改进。首先,year, month, and date应该组合在一个正则表达式组中,例如timestamp。现在,您的InvoiceDetail函数会收到timestamp字符串,但随后您可以使用datetime.strptime()(甚至更简单,dateutil.parse())将该字符串转换为{{1数据库查询的对象。

其次,您可能需要考虑将过滤器值放在GET查询中,而不是在URL中对它们进行硬编码(即类似datetime)。您不仅不必编写复杂的正则表达式,而且还可以获得更灵活的URL。