Django过滤查询集

时间:2017-01-24 14:57:04

标签: python django

以下是我的简单观点:

def transaction_list(request):
    current_user = request.user
    month = datetime.date.today().month

    try:
        page = request.GET.get('page', 1)
    except PageNotAnInteger:
        page = 1

    objects = Transaction.objects.filter(user=current_user, date__month=month)
    p = Paginator(objects, 10, request=request)
    transactions = p.page(page)
    return render(request, 'transaction/list.html',
                  {'transactions': transactions})

显示当前月份发生的交易清单。 我想添加一个选项来更改正在显示的事务的月份,但我不知道如何解决这个问题并让它工作。它应该在视图中完成吗?也许模板?我很感激任何想法

1 个答案:

答案 0 :(得分:0)

花点时间阅读一些Django文档,因为它们可能证明非常有价值(更不用说它们非常干净并且为每个可用的版本编写得很好)。我会专注于Working With Forms

简而言之,您可以将django模板中的月份(可能通过ajax或简单的HTML表单POST)传递给您的视图,并使用视图函数获取POST数据并在查询集中使用它。 / p>

很难提供一个好的,彻底的答案,因为有不同的方法可以做到这一点。你想要AJAX吗?简单的表单与页面重新加载等?

好的,这里详细说明了我通常处理POST请求的方式。这不是经过测试的代码,它只是伪代码,但应该工作,尽管我可以告诉,除了一些小的错别字可能。但是,它应该让你知道如何在Django中处理ajax请求。

这非常简单,需要一些时间来阅读文档并通过一些早期的项目来涵盖这些概念,所以我深入研究对SO读者来说并不是很有价值。

views.py

class change_date_form(forms.Form):
    new_date = forms.DateField()

def change_transaction_date(request):
    #Do some checks to make sure user is authorized to do this
    current_user = ... 
    customer_data = []
    if request.method == 'POST':
       form = change_date_form(request.POST, request.FILES)
       if form.is_valid():
           change_date = form.cleaned_data.get('new_date')
           objects = Transaction.objects.filter(user=current_user, date__month=change_date)
           for i in objects:
               customer_data.append(objects.name)
    response_data = json.dumps(customer_data)
    return HttpResponse(response_data, content_type='application/json')

urls.py

...
url(r'^change_date_view/', 'module.views.change_transaction_date'),

Jquery的:

$('button_handler').on('click', function() { 
 var new_date_value = $(date_field_selector).val()
 $.ajax({ 
    url: "/change_date_view/",
    type: "POST",
    data: { 
       new_date: button_handler,
      },
    success:function(data) { 
      //build your html via javascript with response data
       }
 })

})