2

I am using class based views for my Django viewflow project. However I am getting the below error:

Reverse for 'index' not found. 'index' is not a valid view function or pattern name

Here are my classes:


rules/flows.py

class MyFlow(Flow):
    """
    My App Flow
    """
    process_class = models.MyProcess

    start = flow.Start(
        views.MyDetailView,
        fields=["rule"],
        task_title="New Task"
    ).Permission(
        auto_create=True
    ).Next(this.end)

    end = flow.End()

rules/urls.py

rule_urls = FlowViewSet(MyFlow).urls

urlpatterns = [
     url(r'^rule/', include(rule_urls, namespace='rule')),
     url(r'^(?P<pk>\d+)/mydetail/', MyDetailView.as_view(), {'flow_class': MyFlow, 'flow_task': MyFlow.start}, name='mydetail')
]

rules/models.py

class SubRules(models.Model):
    rule_id = models.AutoField(primary_key=True)
    src_id = models.IntegerField()
    src_description = models.CharField(max_length=160, blank=True)
    class Meta:
        db_table = 'sub_rules'


class EntRules(models.Model):
    rule = models.OneToOneField(SubRules, primary_key=True, on_delete=models.CASCADE)
    entitlement_code = models.IntegerField()
    rule_approved = models.SmallIntegerField()
    rule_approved_datetime = models.DateTimeField(null=True)
    class Meta: 
        db_table = 'ent_rules'

class MyProcess(Process):
    entrule = models.ForeignKey(EntRules, blank=True, null=True, on_delete=models.CASCADE)
    class Meta:
        permissions = (
                       ('approve_ent_rules','Can approve ent_rules')
                      )

rules/forms.py

class MyDetailForm(forms.ModelForm):

    class Meta:
       model = EntRules
       fields = [
                  'rule',
                  'entitlement_code',
       ]


    def __init__(self, *args, **kwargs):
       pk = kwargs.pop('rule_id', None)
       super(MyDetailForm, self).__init__(*args, **kwargs)
       sub_rule = SubRules.objects.get(rule_id=pk)
       self.fields['rule'].queryset = sub_rule.objects.filter(rule_id=pk)

rules/views/my_detail.py

class MyDetailView(StartFlowMixin, generic.UpdateView):

    model = EntRules
    template_name = 'rules/my_detail.html'
    form_class = MyDetailForm

    layout = Layout(
        Fieldset('Rule Details',
                 Row('rule',),
                 Row('entitlement_code',),
                 )
    )

    def activation_done(self, form):
        ent_rule = form.save()
        self.activation.process.entrule = ent_rule
        super(MyDetailView, self).activation_done(form)

    def get_object(self):
        return self.activation.process.entrule


    def get_form_kwargs(self):
        kwargs = super(MyDetailView, self).get_form_kwargs()
        pk = int(self.kwargs['pk'])
        kwargs['rule_id'] = pk
        return kwargs

rules/templates/rules/my_detail.html

{% extends "base.html" %}
{% load material_form %}

{% block content %}
    <form method="POST">
        {% csrf_token %}
        <div class="row">
            {% form form=form %} {% endform %}
            {{ activation.management_form }}
            <div class="right">
               <button type="submit" name="_start" class="btn">Submit</button>
            </div>
        </div>
   </form>
{% endblock %}

Can you please advise what could be the issue here ?

I looked at Process Views outside viewflow.frontend

However how do I pass the sub_rule pk "^(?P\d+)" to startview as given in the URL like below ?

class MyFlow(Flow):
    start = flow.Start(detail_view_class=MyDetailTaskView)

Please advise.

user1261115
  • 73
  • 1
  • 6
  • The above error was fixed once I added the below change. {'flow_class': MyFlow, 'flow_task': MyFlow.start} in rules/urls.py. However I got another error "'int' object has no attribute 'get_bound_field' in html page – user1261115 Dec 17 '18 at 04:11
  • {% load material_form material_form_internal %} {% part form %} {% if form.non_field_errors%}
    {% for error in form.non_field_errors %} {{ error }} {% endfor %}
    {% endif %} {% part form hidden %}{% for hidden in form.hidden_fields %}
    – user1261115 Dec 17 '18 at 04:18
  • Update your POST. – R. García Dec 17 '18 at 14:40
  • The error "int object has no attribute get_bound_field was resolved by setting self.fields['rule'].queryset = sub_rule.objects.filter(rule_id=pk) – user1261115 Dec 18 '18 at 16:32

1 Answers1

1

You can just pass a custom detail view as an argument for flow.Start http://docs.viewflow.io/viewflow_flow_nodes.html#viewflow.flow.StartFunction.detail_view

kmmbvnr
  • 5,863
  • 4
  • 35
  • 44
  • Thanks for details. However I need to pass an argument pk to custom details view. Can you please let me know how to do this. – user1261115 Dec 19 '18 at 15:52
  • I tried 'entrules:rule:start',args=[tables.A('pk')] but got the error message Reverse for 'start' with arguments '(1,)' not found. 1 pattern(s) tried: ['entrules/rule/start/$'] – user1261115 Dec 19 '18 at 15:57
  • passing my custom detail view as an argument to flow.View did not work, but subclassing flow.View with a one liner, detail_view_class=MyCustomDetailView worked fine. – Dan Walters Oct 21 '20 at 14:24