Django 通过url发送日期字段,筛选项目

Django 通过url发送日期字段,筛选项目,django,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.vie

我正在制作一个基本的发票系统,在这里我创建了计费周期和项目。我选择和项目,当它被购买,然后我想过滤他们申请的月份项目。我是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)

首先,你的URL正则表达式是错误的;指定的组“年”和“月”重复两次。我猜你会想把其中两个改成日期和身份

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

从那时起,您可以使用年、月、日的值来筛选发票

不过,您可以做一些改进。首先,年、月和日期应该组合在一个正则表达式组中,比如时间戳。现在,InvoiceDetail函数将以字符串形式接收时间戳,但是您可以使用datetime.strTime或更简单的dateutil.parse将该字符串转换为用于数据库查询的datetime对象

第二,您可能想考虑将过滤器值放在GET查询中,而不是在URL IE中对它们进行硬编码。您不仅不必编写复杂的正则表达式,还可以获得更灵活的URL