Django использует имя пользовательского метода в представлении класса Django

У меня есть Url, как /foo/bar и представление на основе класса было определено как показано ниже.

class FooBar(View):
    
   def handle_post_bar(self, request):
     pass

   def handle_get_bar(self, request):
     pass

   def handle_put_bar(self, request):
     pass

В url я определяю как path('foo/bar/', FooBar.as_view())

На основе метода http и пути я хотел бы построить имена методов просмотра, например: handle_{0}_{1}'.format(method, path) Пожалуйста, подскажите, как этого добиться, это должно быть общим для всех урлов и представлений. Я пытался исследовать возможность использования промежуточного ПО django, но в итоге ничего не получилось.

Оки, это конечно возможно, вы должны написать свою логику следующим образом:

class FooBar(View):
    func_expr = 'handle_{0}_bar'

    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        method = request.method.lower()
        func = self.func_expr.format(method)
        if hasattr(self, func):
            return getattr(self, func)(request)
        raise Http404

    def handle_post_bar(self, request):
        print('POST')
        return JsonResponse({'result': 'POST'})

    def handle_get_bar(self, request):
        print('GET')
        return JsonResponse({'result': 'GET'})

    def handle_put_bar(self, request):
        print('PUT')
        return JsonResponse({'result': 'PUT'})

Это работает для меня:

enter image description here

Обычно подобные вещи кодируются в методе под названием dispatch. Если вы хотите добиться этого на нескольких представлениях (не только на одном) без повторения кода, вам следует написать собственный миксин, который использует эту логику. Удачи!

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