Вопрос:Доступ к текущему экземпляру класса вида в Django промежуточного
Я пытаюсь получить доступ к атрибуту экземпляра вида в промежуточном слое.
Например, если класс на основе зрения, как это:
# views.py
class MyView(View):
my_attribute = 'something'
Я хотел бы быть в состоянии получить ручку на my_attribute
в ПО промежуточного слоя, делая что-то вроде этого:
# middleware.py
def process_view(self, request, view_func, view_args, view_kwargs):
my_attribute = request.view.my_attribute
Конечно, это не работает, потому что Django не выставляет экземпляр представления через объект запроса. Есть ли способ добиться этого?
Спасибо!
Моя первая попытка:
Первоначально я полагал, что метод process_view()
может быть хорошим местом, чтобы сделать это. К сожалению, аргумент view_func
, который он получает, содержит функцию - результат MyView.as_view()
- а не сам экземпляр представления. Из Django docs:
process_view (самости, запрос, view_func, view_args, view_kwargs)
... view_func функция Python, что Django собирается использовать. (Это фактическая функция объекта, а не имя функции в виде строки.) ...
Моя вторая попытка:
Дескриптор экземпляра вида доступен в process_template_response()
, но это довольно неудобно, и в любом случае я хотел бы иметь возможность работать с my_attribute
в более ранней точке стека промежуточного программного обеспечения. Но это действительно так:
def process_template_response(self, request, response):
my_attribute = response.context_data['view'].my_attribute
чем проблема вы пытаетесь решить? –
@ burhan-khalid: Цель состоит в размещении некоторых данных в контексте шаблона в зависимости от значения атрибута view. Я бы сделал это с помощью процессора контекста, но не нашел способ доступа к экземпляру представления в процессоре контекста. Мой текущий подход заключается в использовании mixin, который переопределяет 'get_context_data()'. Это выполняет свою работу, но эта функция требуется для каждого запроса, поэтому я бы хотел избежать наследования из mixin в каждом отдельном представлении приложения. – tino
Я могу придумать и ряд других приложений. всего лишь один пример: простой способ управления доступом к просмотру. Я знаю, что есть другие способы управления доступом, но это кажется особенно простым методом, и мне бы хотелось узнать, возможно ли это. – tino