Classed Based Views : Почему параметры URL в Django/DRF помещаются в `self.kwargs`, а не в другой атрибут (например, `self.url_params`)?

В процессе работы с Django/Django Rest Framework я заметил несоответствие в том, как параметры URL обрабатываются в class-based-views.


Описание проблемы

В представлениях на основе общих классов я могу получить доступ к параметрам URL двумя разными способами - в зависимости от метода:

  1. Через позиционные аргументы: Например, в методе get я могу получить доступ к параметрам URL как к позиционным аргументам, переданным непосредственно методу:
#urls.py
path('test/<str:param1>/<int:param2>/', MyView.as_view())
#views.py
class MyView(View):
    def get(self, request, param1, param2):
        return JsonResponse({'param1': param1, 'param2': param2})
  1. Через атрибут self.kwargs Например, когда я хочу получить доступ к тем же параметрам в методе get_queryset, я должен использовать self.kwargs
#views.py
class MyView(ListView):
    model = MyModel

    def get_queryset(self):
        param1 = self.kwargs.get('param1')
        param2 = self.kwargs.get('param2')
        return MyModel.objects.filter(field1=param1, field2=param2)

Я знаю, что могу получить доступ к параметрам url из kwargs любого места, но это приводит меня к некоторым вопросам

Мои вопросы:

  • Почему Django/DRF не ввели специальный атрибут для параметров URL? Разве не было бы более интуитивно понятным хранить эти параметры в специальном атрибуте, таком как self.url_params - есть ли какие-либо конкретные причины, почему предпочтительнее использовать имя self.kwargs - я понял соглашение, но оно меня немного смущает, у нас есть много других атрибутов, таких как idk self.data или self.method, но у нас нет такого для атрибутов url.
  • Почему механизм self.kwargs не объясняется в документации Django. У меня немного болела голова, когда я пытался понять, почему. Этот механизм кажется крайне важным для работы с представлениями, основанными на классах, но я не смог найти четкого объяснения, почему это так. Вместо этого в документации приводятся только примеры, видимо, ожидая, что разработчики «сделают вывод», что параметры URL хранятся в self.kwargs.

Может ли кто-нибудь пролить свет на то, почему так происходит? Буду признателен за любые соображения или объяснения этого дизайнерского решения.

Вернуться на верх