Встроенные формы с django внешним видом потока - PullRequest
0 голосов
/ 11 марта 2020

Я могу заставить встроенный набор форм работать нормально с django, но при попытке использовать viewflow и встроенный интерфейс рабочего процесса, я не могу заставить встроенную форму работать во время рабочего процесса.

Как правильно ссылаться на набор форм?

Поскольку модели рабочих процессов наследуются от объекта viewflow.models.Process, я не могу понять, как для создания встроенной связанной модели.

Вариант использования: у меня есть рабочий процесс с около 50 различными полями, и я могу прекрасно запустить рабочий процесс, используя Flow и разбивая процесс на логические части примерно за 10 шагов. Однако после запуска процесса и ввода первых 3 или 4 полей я хочу, чтобы шаг 2 представлял собой встроенную форму, в которой пользователям назначаются различные роли (неизвестное число) для этого конкретного события рабочего процесса.

I у меня уже есть отдельная таблица, в которой они назначаются ролям вручную, и я могу сделать так, чтобы Flow назначил следующую задачу тому, кому назначена эта роль «шагов», и она работает нормально, но я хочу, чтобы действие по назначению ролей было частью сам фактический рабочий процесс.

Я подозреваю, что должен добавить набор inlineformset в качестве поля родительской модели (Process), но не мог понять, как ...

Я подхожу близко (по крайней мере, с кодом ниже, но

  1. Я не получаю повторяющуюся встроенную форму
  2. , когда я отправляю сообщение об ошибке с Данные ManagementForm отсутствуют или были подделаны
# models.py

from django.db import models
from django.utils import timezone
from filer.fields.file import FilerFileField
from viewflow.models import Process

# Create your models here.

class RoutingSheetProcess(Process):
    project     = models.CharField(verbose_name=u"Project#",max_length=20,blank=False,null=False)
    internaltask     = models.CharField(verbose_name=u"Task #",max_length=20,blank=False,null=False)
    pono        = models.CharField(verbose_name=u"P.O. Number",max_length=20,blank=True,null=True)
    sampletype  = models.CharField(verbose_name=u"Sample Type",max_length=10)
    sampleother = models.CharField(verbose_name=u"Other Sample Type",max_length=20,blank=True,null=True)
    sampledate  = models.DateField(verbose_name=u"Date Sample Taken",blank=True,null=True)

class InlineModel(models.Model):
    routingsheet = models.ForeignKey(RoutingSheetProcess,on_delete=models.CASCADE,blank=False,null=False)
    field1 = models.CharField(max_length=20,blank=True,null=True)
    field2 = models.CharField(max_length=20,blank=True,null=True)
    field3 = models.CharField(max_length=20,blank=True,null=True)
# flows.py

from viewflow import flow, frontend
from viewflow.base import this, Flow
from viewflow.flow.views import CreateProcessView, UpdateProcessView

from .models import RoutingSheetProcess
from . import views



@frontend.register
class RoutingSheetFlow(Flow):
    process_class = RoutingSheetProcess

    start = (
        flow.Start(
            CreateProcessView,
            fields=["project","internaltask","pono"]
        ).Permission(
            auto_create=True
        ).Next(this.sample)
    )

    sample = (
        flow.View(
            UpdateProcessView,
            fields=["sampletype","sampleother","sampledate"]
        ).Permission(
            auto_create=True
        ).Next(this.inline_sample)
    )

    inline_sample = (
        flow.View(
            views.InlineSample
        ).Permission(
            auto_create=True
        ).Next(this.end)
    )

    end = flow.End()
# views.py

from django.shortcuts import render

from viewflow.flow.views import CreateProcessView, UpdateProcessView

# Create your views here.

from .forms import *

from material import *

class InlineSample(UpdateProcessView):
    form_class=InlineForm

    def get_context_data(self, **kwargs):
        data = super(InlineSample, self).get_context_data(**kwargs)
        if self.request.POST:
            data['fields'] = InlineFormset(self.request.POST)
        else:
            data['fields'] = InlineFormset()
        #print(data)
        #for f in data['fields']:
        #    print(f)
        return data


    layout = Layout(
        Fieldset('Inline Fields',
            Row('field1','field2','field3'),
        )
    )

    def get_object(self):
        #print(self.activation.process)
        return self.activation.process 
# forms.py

from django import forms
from django.forms import ModelForm
from django.forms.models import inlineformset_factory, formset_factory

from .models import *

InlineFormset=inlineformset_factory(
        RoutingSheetProcess, #parent
        InlineModel, #child
        fields=('field1','field2','field3'), #fieldlist from child
        extra=2
        )  

class InlineForm(ModelForm):

    class Meta:
        model=InlineModel

        exclude=[]
        widgets = {
            #'description':forms.Textarea,
        }

Производит это на шаге 2 потока ... вывод шага 2

1 Ответ

0 голосов
/ 12 марта 2020

Для обработки наборов форм django -материал предоставляет поле InlineFormSet, но доступно только в PRO версии

http://docs.viewflow.io/forms_formsets.html https://github.com/viewflow/viewflow/blob/master/demo/shipment/forms.py#L7

...