我正在制作一个基本发票系统,我在其中创建了结算周期和项目。我选择和项目,当它“买”,然后我想按照它们应用的月份过滤项目。我是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 :(得分:0)
首先,您的URL正则表达式是错误的;命名组year
和month
重复两次。我猜你想把其中两个变成date
和id
在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。