0

最近、Django 用の Viewflow ライブラリに出会いました。これは、複雑なワークフローを作成するための非常に強力なツールのようです。

私のアプリは、チケットを作成することによってワークフローが開始される単純なチケット システムです。ユーザーは、標準の Django 管理者の change_list/detail と同様に、CRUD ページを介してチケットに関連付けられた 0 個以上の WorkLog を作成できる必要があります。 .

リスト ビューのテンプレートはどのようなものにしますか? UI をライブラリのフロントエンドに統合したいと考えています。

このフローは明らかに次のビューを利用しています。

1) チケットの CreateView

2a) WorkLog の ListView テンプレートには、「戻る」、「追加」(ステップ 2b に進む)、「完了」(ステップ 3 に進む) というコントロールがあります。

2b) WorkLog の CreateView

3) 終了

コード:

models.py:

class TicketProcess(Process):
    title = models.CharField(max_length=100)
    category = models.CharField(max_length=150)
    description = models.TextField(max_length=150)
    planned = models.BooleanField()

    worklogs = models.ForeignKey('WorkLog', null=True)


class WorkLog(models.Model):
    ref = models.CharField(max_length=32)
    description = models.TextField(max_length=150)

ビュー.py:

class WorkLogListView(FlowListMixin, ListView):

    model = WorkLog


class WorkLogCreateView(FlowMixin, CreateView):

    model = WorkLog
    fields = '__all__'

フロー.py:

from .views import WorkLogCreateView
from .models import TicketProcess

@frontend.register
class TicketFlow(Flow):
    process_class = TicketProcess

    start = (
        flow.Start(
            CreateProcessView,
            fields = ['title', 'category', 'description', 'planned']
        ).Permission(
            auto_create=True
        ).Next(this.resolution)
    )

    add_worklog = (
        flow.View(
            WorkLogListView
        ).Permission(
            auto_create=True
        ).Next(this.end)
    )

    end = flow.End()
4

1 に答える 1

0

別のビューまたは同じビューでそれを処理できますactivation.doneが、作業ログの追加要求を呼び出さないでください。request.POST データでどのボタンが押されたかを確認することで実行できます。

@flow.flow_view
def worklog_view(request):
    request.activation.prepare(request.POST or None, user=request.user)
    if '_logitem' in request.POST:
         WorkLog.objects.create(...)
    elif request.POST:
        activation.done()
        request.activation.done()
        return redirect(get_next_task_url(request, request.activation.process))
    return render(request, 'sometemplate.html', {'activation': request.activation})
于 2017-07-25T12:07:04.947 に答える