1

知道task实例有没有办法得到url它?例如在食谱中:https ://github.com/viewflow/cookbook/blob/master/helloworld/demo/helloworld/flows.py - 我如何获得assign任务的url approve flow_task

我知道有flow_task.get_task_url(task, url_type='guess', namespace='', **kwargs),但关键是从我所看到的namespace通常是从中获取的self.request.resolver_match.namespace。这并不理想——如果我们在应用程序的其他部分并且我们只是想直接提供任务的链接怎么办?

4

3 回答 3

1

与 django reverse 相同,您需要传递命名空间来获取 URL。在内置视图流前端的情况下,命名空间是viewflow:[app_label]:[flow_label]ex:“viewflow:helloworld:helloworld”

于 2018-06-07T11:09:21.370 回答
0

如果模板中有任务对象,可以按如下方式提取 url:

<a href="/workflow/formworkflow/{{ task.process.flow_class.flow_name }}/{{ task.process.flow_class.process_name }}/{{ task.process.pk }}/{{task.flow_task.name}}/{{task.id}}">Task Link</a>

如果经常使用,可以将其添加为模板过滤器。

在我了解名称空间的工作原理之前,这是一个肮脏的技巧。

于 2020-07-17T11:39:28.187 回答
-1

要获取任务的 url,您只需要app_name(app_namespace), flow_namespace and flow_label. 这里最具挑战性的项目是 flow_namespace(如果你没有使用前端 url)。要解决此问题,您可以使用从 FlowListMixin 的 ns_map 借用的地图。为项目中的每个流定义 flow_namespace。然后,您从上面确定流命名空间和 url_name。

ns_map = {'MyFlow':'flow_namespace', 'AnotherFlow':'flow_namespace2'}

# flow_namespace as defined in the urls.py
# e.g if you defined your flow urls as
# flow_urls = FlowViewSet(MyFlow).urls
# flow_urls2 = FLowViewSet(MyFlow2).urls
# urlpatterns = [url(r'flow_path/', include(flow_urls, name=flow_namespace)),
# url(r'flow_path2/', include(flow_urls2, name=flow_namespace2)),
# ]
# With this is included in the root_url as
# urlpatterns = [
#     url(r'app/' include(app_urls, namespace='app_namespace')
#]

您需要像这样反转流程 reverse('app_name:flow_namespace:flow_label', kwargs={'process_pk':ppk, 'task_pk':tpk})

flow_class_name = task.process.flow_class.__name__
flow_namespace = ns_map.get(flow_class_name)
app_name = task.process.flow_class.__module__.split('.')[0]
flow_label = task.flow_task.name
url_name = "{}:{}:{}".format(app_name, flow_label, url_name)

然后你可以反转你的任务网址

url = reverse(url_name, kwargs={"task_pk", task.pk, "process_pk":task.flow_process.pk}

# If you know where you are you could use resolver match to determine
# the app namespace. Be Sure of this, see more of that [here][1]

注意:我假设您将应用程序命名为 app_name 如果它不同,您必须找到查找 app_names 命名空间的替代方法,但这应该不会太难。

于 2019-01-24T09:52:27.227 回答