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