python - 包含表单的 Django ListView

标签 python django

最近我在 Django 中从基于方法的 View 转向基于类的 View 。

我觉得我找不到一个很好的解决方案来将ListView与表单一起使用。

以下代码在新 View 中有效,但分页不起作用。

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

基于旧方法的 View :

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,
    })

基于新类的 View :

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})

最佳答案

ListView 为您处理分页。在您的情况下,它不会,因为您正在重写 get 方法。您可以使用get_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)

关于python - 包含表单的 Django ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55317310/

相关文章:

如果它在一个日期范围内,python 得到一天

python - 提取检测到的对象并保存到不同的图像 - OpenCV Python

python - 如何在 ParaView 中为一系列遗留 VTK 文件设置自定义时间步长值?

python - 使用django-audiofield,django-storages,boto将音频文件上传到s3。 django-storages这个后端不支持绝对路径错误

python - Django表单修改HTML标签

javascript - JQuery 工具提示效果不起作用

python - 将base64图像数据上传并保存到django rest框架中的Django图像字段

python - sql server函数 native 参数绑定(bind)错误

django - 使用具有多个站点的 docker 进行开发和生产

python - 解析 POST json 消息 Django/GAE 的问题