我有一个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()

我基本上需要将这个上下文添加到viewflow中的视图中,即AssignTaskView-https://github.com/viewflow/viewflow/blob/f50accb3cde5d53f1d4db0debf5936867712c3bd/viewflow/flow/views/task.py#L109
我试过一些东西来覆盖/添加上下文,但似乎都不起作用。
尝试1:覆盖URL并使用额外的上下文(建议这样做)
-问题是url是“魔法”,我的urlpatterns非常简单:
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中的视图。
我已经成功地覆盖了Viewflow的模板,没有问题,但是覆盖任何其他内容都超出了我的能力范围。有什么建议吗?

最佳答案

是的,您实际上可以通过将视图url放在url模式的顶部来覆盖它

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)),
]

但是仅仅创建一个自定义流就更简单了
https://github.com/viewflow/viewflow/blob/master/viewflow/flow/nodes.py#L306
from viewflow import flow

class MyView(flow.View):
      assign_view_class = MyAssignTaskView

flows.py版本:
 class MyFlow(Flow):
    ...
    taskname = MyView(UpdateProcessView).next(this.end)

这就是您可以覆盖任何内置视图的方式。
Viewflow旨在提供代码库中的所有旋钮。可以通过子类化流或流节点类来自定义任何行为。
自定义节点示例可能有帮助
https://github.com/viewflow/viewflow/blob/master/demo/customnode/nodes.py

关于python - 使用自定义上下文覆盖django View (Django 1.11,Viewflow),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47064749/

10-13 06:21