Django ListView, который включает в себя формы - PullRequest
1 голос
/ 23 марта 2019

В последнее время я перехожу от представлений на основе методов к представлениям на основе классов в 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})

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

ОК, поэтому вам не нужно добавлять метод записи, а только использовать метод 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

здесь вы можетеузнать больше о базовом представлении класса

0 голосов
/ 24 марта 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...