最近,我正在从基于方法的视图转移到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})
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)
好的,所以你不需要添加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你可以了解更多关于班级基础的看法