Как установить контекстную переменную всех общих представлений Django одновременно? - PullRequest
0 голосов
/ 11 ноября 2018

У меня будут стандартные представления на основе классов для операций CRUD, которые наследуются от различных общих представлений, таких как ListView, DetailView и так далее. Я буду устанавливать все их context_object_name приписать к тому же значению.

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

пс. что мне приходит в голову, конечно, дальнейшее наследование, но, может быть, есть еще какой-то джанго-подобный способ?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы также можете использовать миксин вместо промежуточного приложения:

class CommonContextMixin(object):
    def get_context_data(self, *args, **kwargs):
        context = super(CommonContextMixin, self).get_context_data(*args, **kwargs)
        context['foo'] = 'bar'

        return context

Тогда используйте этот миксин в своих взглядах:

class MyView(TemplateView, CommonContextMixin):
    """ This view now has the foo variable as part of its context. """

Соответствующие документы Django: https://docs.djangoproject.com/en/2.1/topics/class-based-views/mixins/

0 голосов
/ 12 ноября 2018

Промежуточное ПО может добиться цели

class SetContextObjectNameMiddleware:

    def process_template_response(self, request, response):
        if 'object' in response.context_data:
            response.context_data['foo'] = response.context_data['object']
        return response

Затем добавьте промежуточное ПО к вашему settings.py

Это на самом деле не устанавливает context_object_name представления, но достигает того же результата.

...