使用自定义上下文覆盖 Django 视图(Django 1.11,Viewflow)
Overwrite django view with custom context (Django 1.11, Viewflow)
我有一个使用 Viewflow 的 Django 1.11 项目 - https://github.com/viewflow/viewflow - 我已经合并了。它非常有帮助,但很多东西都是 "magic",作为我的第一个严肃的 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
我已经尝试了一些方法来 overwrite/add 上下文,但 none 似乎有效。
尝试 1:覆盖 URL 并使用 extra_context(因此建议这样做)
- 问题是 url 是 "magic",我的 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 - 然而,它根本不 运行。我可能遗漏了一些东西,但我无法弄清楚如何真正强制它使用 my 视图而不是视图流中内置的视图。
我已经毫无问题地成功覆盖了 Viewflow 的模板,但覆盖任何其他内容超出了我的范围。有什么建议吗?
是的,您实际上可以通过将视图 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
flows.py:
class MyFlow(Flow):
...
taskname = MyView(UpdateProcessView).next(this.end)
这就是您可以覆盖任何内置视图的方法。
Viewflow 旨在提供代码库中的所有旋钮。您可以通过子类化 Flow 或 flow Node 类.
来自定义任何行为
自定义节点示例可能会有帮助
https://github.com/viewflow/viewflow/blob/master/demo/customnode/nodes.py
我有一个使用 Viewflow 的 Django 1.11 项目 - https://github.com/viewflow/viewflow - 我已经合并了。它非常有帮助,但很多东西都是 "magic",作为我的第一个严肃的 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
我已经尝试了一些方法来 overwrite/add 上下文,但 none 似乎有效。
尝试 1:覆盖 URL 并使用 extra_context(因此建议这样做)
- 问题是 url 是 "magic",我的 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 - 然而,它根本不 运行。我可能遗漏了一些东西,但我无法弄清楚如何真正强制它使用 my 视图而不是视图流中内置的视图。
我已经毫无问题地成功覆盖了 Viewflow 的模板,但覆盖任何其他内容超出了我的范围。有什么建议吗?
是的,您实际上可以通过将视图 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
flows.py:
class MyFlow(Flow):
...
taskname = MyView(UpdateProcessView).next(this.end)
这就是您可以覆盖任何内置视图的方法。
Viewflow 旨在提供代码库中的所有旋钮。您可以通过子类化 Flow 或 flow Node 类.
来自定义任何行为自定义节点示例可能会有帮助
https://github.com/viewflow/viewflow/blob/master/demo/customnode/nodes.py