2016-03-24 1 views
2

Простейшее тестовое приложение с viewflow.io с использованием функциональных представлений, а не встроенных представлений на основе классов. Предполагаемая идея заключается в том, что продукт добавляется, а затем одобряется (через два разных вида/формы). Есть два вопроса, я не могу работать:.Пропускные переменные Django Viewflow с функцией на основе функции

  1. Я хочу передать Product на представление утверждения (так что пользователь делает утверждение может увидеть резюме того, что они предназначены для утверждения я не знаю, как это сделать - я попытался прохождения product_pk через flow.View в flows.py, но это приводит к ошибке и, если я оставлю его, то вид утверждения обновляет все записи, а не текущий продукта
  2. flow.If ворота в потоках.. py всегда кажется True, независимо от того, было ли проверено поле в продукте или нет. В идеале я надеюсь, что одобрение будет записано в модели продукта, а не в процессе модель

Наверное, принципиальная ошибка/концепция Я пропустил - любая помощь будет оценена.

В models.py

class Product(models.Model): 
    name = models.CharField(max_length=30) 
    quantity = models.IntegerField() 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.name 

class ProductProcess(Process): 
    product = models.ForeignKey(Product, blank=True, null=True) 

    def approved(self): 
     return self.product.approved 


class ProductTask(Task): 
    class Meta: 
     proxy = True 

В flows.py

class ProductFlow(Flow): 
    process_cls = ProductProcess 
    task_cls = ProductTask 

    start = flow.Start(start_process).Next(this.approve) 

    approve = flow.View(approve_product).Next(this.checkapproval) 

    checkapproval = flow.If(cond=lambda p: p.approved()) \ 
     .OnFalse(this.approve) \ 
     .OnTrue(this.end) 

    end = flow.End() 

В views.py

@flow_start_view() 
def start_process(request, activation): 
    activation.prepare(request.POST or None,) 
    form = ProductForm(request.POST or None) 

    if form.is_valid(): 
     Product.objects.create(
      name = form.cleaned_data['name'], 
      quantity = form.cleaned_data['quantity'] 
     ) 
     activation.done() 
     return redirect('/test') 

    return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form}) 

@flow_view() 
def approve_product(request, activation): 
    activation.prepare(request.POST or None,) 
    form = ApproveProductForm(request.POST or None) 

    if form.is_valid(): 
     Product.objects.update(
      approved = form.cleaned_data['approved'] 
     ) 
     activation.done() 
     return redirect('/test') 
    return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form}) 

Форма, которая является ча lled - это очень простой класс ModelForm, и URL-адреса точно такие же, как описано в демонстрационных приложениях на страницах проекта GitHub. Шаблон имеет тег {{ activation.management_form }}.

ответ

0

Прежде всего, вам необходимо связать продукт и процесс. Таким образом, с точки зрения запуска, вы можете сделать

if form.is_valid(): 
    product = Product.objects.create(
     name = form.cleaned_data['name'], 
     quantity = form.cleaned_data['quantity'] 
    ) 
    activation.process.product = product 
    activation.done() 

или даже лучше, если ProductForm является ModelForm

if form.is_valid(): 
    product = form.save() 
    activation.process.product = product 
    activation.done() # here is new process instance created and saved to db 

Таким образом, вид утверждения можно переписать в виде ::

@flow_view() 
def approve_product(request, activation): 
    activation.prepare(request.POST or None,) 
    form = ApproveProductForm(request.POST or None, instance=activation.process.product) 

    if form.is_valid(): 
     form.save() # here is the approved field is updated 
     activation.done() 
     return redirect('/test') 
    return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form}) 

В Кроме того, вы можете взглянуть на пример представления с функциями, основанными на функциях - https://github.com/viewflow/cookbook/blob/master/viewflow_customization/customization/parcel/views.py

+0

Kickass! :) Большое спасибо за супер быстрый ответ (надеюсь, мне удастся выработать оставшуюся часть Viewflow, не публикуя вопросов по каждому препятствию!) Приложение выглядит фантастично до сих пор BTW –