django-viewflow - 无需请求即可获取任务URL

时间:2018-05-31 06:37:06

标签: django-viewflow

知道task实例是否有办法获取url它?例如,在食谱中:https://github.com/viewflow/cookbook/blob/master/helloworld/demo/helloworld/flows.py - 如何获取assign approve flow_task任务的网址?

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果模板中包含任务对象,则可以按以下方式提取网址:

<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>

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

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

答案 2 :(得分:-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)

Then you can reverse your task url
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命名空间的方法,但这应该不会太困难。