2015-05-19 42 views
0

我正在制作一个基本发票系统,我已创建帐单期间和项目。我选择和项目,当它被“买”,然后我想过滤它们应用的月份项目。我是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) 

回答

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())将该字符串转换为数据库查询的datetime对象。

其次,您可能需要考虑将过滤器值置于GET查询中,而不是将其硬编码到URL中(即像?datetime=2015-05-19&id=abcdef之类的东西)。您不但不需要编写复杂的正则表达式,还可以获得更灵活的URL。