Django ListView包括表单

问题描述 投票:1回答:2

最近,我正在从基于方法的视图转移到Django中基于类的视图。

我觉得我找不到将ListView与表单一起使用的好方法。

新视图中的代码下方有效,但分页不起作用。

我在哪里做错了?另外,您认为新观点是什么?还有另一种更清洁的方法吗?

基于旧方法的视图:

def list_orders(request):
    if request.method == 'POST':
        form = billing_forms.OrdersForm(request.POST)
        object_list = orders.list_orders_by_date(
            owner=request.user,
            year=form.data.get('year'),
            month=form.data.get('month')
        )
    else:
        form = billing_forms.OrdersForm()
        object_list = billing_orders.list_orders(owner=request.user)

    page = request.GET.get('page', 1)
    paginator = Paginator(objects_list, 10)
    try:
        object_list = paginator.page(page)
    except PageNotAnInteger:
        object_list = paginator.page(1)
    except EmptyPage:
        object_list = paginator.page(paginator.num_pages)

    return shortcuts.render(request, 'billing/orders.html', {
        'object_list': object_list,
        'form': form,
    })

基于新类的视图:

class OrdersListView(ListView, BaseLoginRequiredMixin):
    template_name = 'billing/orders.html'
    paginate_by = 10

    def get(self, request, *args, **kwargs):
        form = billing_forms.OrdersForm()
        object_list = billing_orders.list_orders(owner=request.user)
        return shortcuts.render(request, self.template_name, {'form': form, 'object_list': object_list})

    def post(self, request, *args, **kwargs):
        form = billing_forms.OrdersForm(request.POST)
        object_list = billing_orders.list_orders_by_date(
            owner=request.user,
            year=form.data.get('year'),
            month=form.data.get('month'),
        )
        return shortcuts.render(request, self.template_name, {'form': form, 'object_list': object_list})
python django
2个回答
0
投票

ListView为您处理分页。在你的情况下,它没有,因为你重写get方法。你可以使用get_queryset方法提供queryset,没有必要重写整个get方法:

class OrdersListView(ListView, BaseLoginRequiredMixin):
    template_name = 'billing/orders.html'
    paginate_by = 10
    form_class = billing_forms.OrdersForm
    model = Order

    def get_queryset(self):
        return billing_orders.list_orders(owner=self.request.user)

0
投票

好的,所以你不需要添加post方法但只使用GET方法并过滤查询:来自django.http import HttpResponseRedirect

class OrdersListView(ListView, BaseLoginRequiredMixin):
    template_name = 'billing/orders.html'
    model = billing_orders
    paginate_by = 10

    def get_queryset(self):
        #handle you queryset
        query = billing_orders.list_orders(owner=request.user)

        if self.request.GET.get("year", None) != None:
            return query.filter(year=self.request.GET.get("year"))
        else:
            return query

here你可以了解更多关于班级基础的看法

© www.soinside.com 2019 - 2024. All rights reserved.