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'})
Это работает для меня:
Обычно подобные вещи кодируются в методе под названием dispatch
.
Если вы хотите добиться этого на нескольких представлениях (не только на одном) без повторения кода, вам следует написать собственный миксин, который использует эту логику. Удачи!