Django CBV: пользовательские миксины, которые перекрывают один и тот же метод одного представления - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть следующий CBV с пользовательскими миксинами, AjaxFormMixin_Home и AjaxFormMixin_Production.

# app1/views.py
class BaseView(AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):

Исходя из определенных условий AJAX, оба миксина перекрывают def get_context_data(self, **kwargs):, как требуется FormMixin. Смотри ниже,

# app1/mixins.py
class AjaxFormMixin_Home(ContextMixin, object):

   def get_context_data(self, **kwargs):
       context = super(AjaxFormMixin_Home, self).get_context_data(**kwargs)
       obj = UserNote.objects.all()
       paginatedObject_Home = Paginator(obj, 5)
       page = self.request.GET.get('userNotepage')
       context.update('paginatedObject_Home':paginatedObject_Home.page(page))
       return context

# app2/mixins.py
class AjaxFormMixin_Production(ContextMixin, object):

   def get_context_data(self, **kwargs):
       context = super(AjaxFormMixin_Production, self).get_context_data(**kwargs)
       obj = Production.objects.all()
       paginatedObject_Production = Paginator(obj, 5)
       page = self.request.GET.get('productionPage')
       context.update('paginatedObject_Production':paginatedObject_Production.page(page))
       return context

Теперь это проблема. Изменение порядка наследования в BaseView возвращает только context, как определено этим конкретным миксином. Мне нужно вернуть paginatedObject_Home и paginatedObject_Production на BaseView.

Например,

  1. Ниже будет возвращен только контекст, определенный AjaxFormMixin_Home

    класс BaseView (AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):

  2. Принимая во внимание, что ниже будет только возвращать контекст, как определено AjaxFormMixin_Production

    класс BaseView (AjaxFormMixin_Production, AjaxFormMixin_Home, FormMixin, View):

Наконец, я заметил, что компилятор вообще игнорирует второй миксин (в зависимости от порядка наследования).

Как можно обойти этот тип проблемы?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Спасибо Даниэль за ваш вклад, а также за указание на улучшения в соглашениях об именах. Буду признателен, если вы дадите мне знать, как код отличается от передового опыта, поскольку я самоучка.

Спасибо Alasdair за указание на проблему с отправкой и проверкой формы.

Я решил проблему, не изменив супер-вызов на get_context_data, а изменив соглашение об именах методов внутри каждого миксина. Причина, по которой данные контекста не обновлялись правильно, по-видимому, в том, что

  1. BaseView наследует оба миксина. И вызовы GET обращались к дублирующимся именам методов даже с очень разными функциями.
    1. Alasdair , как вы правильно указали, проверка формы была проблемой из-за одинаковых имен методов для каждого миксина.

Спасибо за ваше время, ребята!

0 голосов
/ 30 апреля 2018

Не думаю, что приведенного в вашем вопросе примера достаточно, чтобы воспроизвести проблему. Кратко рассмотрев код, проблема может заключаться в том, что вы звоните super().get_context_data() вместо простого self.get_context_data().

Однако, даже если это исправит контекст, я не думаю, что ваш нынешний подход сработает. Вы можете иметь несколько миксов с get_context_data, потому что каждый миксин может обновлять контекст. Я не понимаю, как вы думаете, что несколько form_valid или form_invalid методов предназначены для совместной работы.

Я бы посоветовал разместить каждую отдельную форму в другом виде. Тогда ваши миксины должны только переопределить метод get_context_data, и вы можете иметь простое представление для каждой формы.

Кроме того, я не думаю, что ваши миксины должны быть подклассом ContextMixin. Просто наследуй от object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...