Перезаписать представление django с помощью пользовательского контекста (Django 1.11, Viewflow)

У меня есть проект Django 1.11 с использованием Viewflow — https://github.com/viewflow/viewflow — который Я включил. Это было очень полезно, но многие вещи являются чем-то вроде «волшебства», и, поскольку это мой первый серьезный проект Django, я столкнулся с проблемой, которую не знаю, как решить или как лучше всего.

У меня есть общий шаблон, который ожидает много контекста. У меня есть функция, которая добавляет этот контекст ко всем моим представлениям:

def add_general_context(context, MOC, MOC_enabled_fields = (), MOC_status = None):
  context['MOC'] = MOC
  context['current_date'] = timezone.now().strftime("%D")
  context['MOC_form'] = forms.MOCForm(prefix="MOC_form", MOC_enabled_fields=MOC_enabled_fields, instance=MOC)
  context['MOCAttachments'] = models.MOCAttachment.objects.filter(MOC=MOC)
  context['MOCAttachment_form'] = forms.MOCAttachmentForm(prefix="MOCAttachment_form")
  context['MOCApprovals'] = models.MOCApproval.objects.filter(MOC=MOC)
  context['MOCTasks'] = models.MOCTask.objects.filter(MOC=MOC)
  context['MOC_status'] = MOC_status
  context['MOCConversation'] = models.MOCConversation.objects.filter(MOC=MOC)
  # Add comments to the conversation
  for conversation in context['MOCConversation']:
    conversation.comments = models.MOCComment.objects.filter(conversation=conversation)
  context['MOCComment_form'] = forms.MOCCommentForm(MOC=MOC)
  context['MOCCommentReply_form'] = forms.MOCCommentReplyForm()

В основном мне нужно добавить этот контекст в представление, которое находится внутри потока просмотра, а именно, AssignTaskView - https://github.com/viewflow/viewflow/blob/f50accb3cde5d53f1d4db0debf5936867712c3bd/viewflow/flow/views/task.py#L109

Я пробовал несколько вещей, чтобы перезаписать/добавить в контекст, но ничего не работает.

Попытка 1: перезаписать URL-адрес и использовать дополнительный_контекст (SO предложил это)
. Проблема в том, что URL-адреса «магические», мои шаблоны URL-адресов очень просты:

from material.frontend import urls as frontend_urls
urlpatterns = [
  url(r'^MOC/', include('MOC.urls')),
  url(r'', include(frontend_urls)),
]

Перезапись самих URL-адресов была НАМНОГО непосильной задачей, я некоторое время копался в этом, но он использует действительно общие функции для извлечения модулей и т. Д. Я понятия не имел, как на самом деле даже попытаться это сделать.

Попытка 2: перезаписать само представление и функцию get_context_data
Я думаю, что это возможно, но, похоже, это не работает. Мои попытки выглядели примерно так (последняя):

from viewflow.flow.views.task import AssignTaskView as CoreAssignTaskView

class AssignTaskView(CoreAssignTaskView):
  def get_context_data(self, **kwargs):
    context = super(AssignTaskView, self).get_context_data(**kwargs)
    print("Did it work?")
    return context

Это есть в моем views.py, однако он просто не запускается. Я, вероятно, что-то упускаю, но я не могу понять, как на самом деле заставить его использовать мой вид вместо встроенного в поток просмотра.

Я успешно перезаписал шаблоны Viewflow без проблем, но перезаписать что-либо еще мне не под силу. Какие-либо предложения?


person Chris Burrus    schedule 01.11.2017    source источник


Ответы (1)


Да, вы действительно можете переопределить URL-адрес просмотра, поместив его поверх url_patterns.

urlpatterns = [
    url(
        r'^/workflow/appname/flowname/(?P<process_pk>\d+)/taskname/(?P<task_pk>\d+)/assign/$',
        YouCustomView.as_view(),
        {'flow_task': FlowClass.taskname},
        name="{}__assign".format(self.name)))
    ),
    url(r'', include(frontend_urls)),
]

Но проще просто создать собственный подкласс flow.View и установить свой собственный Assign View

https://github.com/viewflow/viewflow/blob/master/viewflow/flow/nodes.py#L306

from viewflow import flow

class MyView(flow.View):
      assign_view_class = MyAssignTaskView

потоки.py:

 class MyFlow(Flow):
    ...
    taskname = MyView(UpdateProcessView).next(this.end)

Вот как вы можете переопределить любое из встроенных представлений.

Viewflow предназначен для предоставления всех ручек в вашей кодовой базе. Вы можете настроить любое поведение, создав подклассы Flow или классов Node.

Пример пользовательского узла может быть полезен

https://github.com/viewflow/viewflow/blob/master/demo/customnode/nodes.py

person kmmbvnr    schedule 02.11.2017