Django Slice Queryset безопасно с помощью GET-атрибута

У меня есть представление списка, как это:

from django.views.generic import ListView

class SomeListView(ListView):
    def get_queryset(self):
        qs = super(SomeListView, self).get_queryset()
        limit = self.request.GET.get('limit', None)

        if limit:
            return qs[:limit]
        return qs

Теперь это далеко не идеальное решение для обработки нарезки, так как

  • открыт для ошибок типа (может быть исправлено, но требует еще одной попытки, исключая)
  • не очень элегантно

Есть ли лучший способ нарезать QuerySets через GET?

1 ответ

Решение

Вы можете использовать форму, чтобы иметь дело со всеми вещами проверки и значениями настроек по умолчанию для ограничения поля. Я бы сделал форму

class SliceForm(forms.Form):
    limit = forms.IntegerField(min_value=1)

а затем использовать его на ваш взгляд, как это

def get_queryset(self):
    qs = super(...).get_queryset()
    form = SliceForm(self.request.GET)

    if form.is_valid():
        return qs[:form.cleaned_data['limit']]
    else:
        return qs
Другие вопросы по тегам