2017-11-01 5 views
1

Ich habe ein Django 1.11-Projekt mit Viewflow - https://github.com/viewflow/viewflow - das ich eingefügt habe. Es war sehr hilfreich, aber viele Dinge sind irgendwie "magisch", und da ich mein erstes ernsthaftes Django-Projekt bin, stoße ich auf ein Problem, von dem ich nicht weiß, wie ich es lösen soll oder wie es am besten funktioniert.Django-Ansicht mit benutzerdefiniertem Kontext überschreiben (Django 1.11, Viewflow)

Ich habe eine generische Vorlage, die viel Kontext erwartet. Ich habe eine Funktion, die diesen Zusammenhang an alle meine Ansichten ergänzt:

def add_general_context(context, MOC, MOC_enabled_fields =(), MOC_status = None): 
    context['MOC'] = MOC 
    context['current_date'] = timezone.now().strftime("%D") 
    context['MOC_form'] = forms.MOCForm(prefix="MOC_form", MOC_enabled_fields=MOC_enabled_fields, instance=MOC) 
    context['MOCAttachments'] = models.MOCAttachment.objects.filter(MOC=MOC) 
    context['MOCAttachment_form'] = forms.MOCAttachmentForm(prefix="MOCAttachment_form") 
    context['MOCApprovals'] = models.MOCApproval.objects.filter(MOC=MOC) 
    context['MOCTasks'] = models.MOCTask.objects.filter(MOC=MOC) 
    context['MOC_status'] = MOC_status 
    context['MOCConversation'] = models.MOCConversation.objects.filter(MOC=MOC) 
    # Add comments to the conversation 
    for conversation in context['MOCConversation']: 
    conversation.comments = models.MOCComment.objects.filter(conversation=conversation) 
    context['MOCComment_form'] = forms.MOCCommentForm(MOC=MOC) 
    context['MOCCommentReply_form'] = forms.MOCCommentReplyForm() 

Ich muss im Grunde diesen Kontext zu einer Ansicht hinzufügen, die innerhalb viewflow ist - nämlich AssignTaskView - https://github.com/viewflow/viewflow/blob/f50accb3cde5d53f1d4db0debf5936867712c3bd/viewflow/flow/views/task.py#L109

Ich habe versucht, eine Einige Dinge, die man überschreiben/hinzufügen könnte, aber keine scheinen zu funktionieren.

Versuch 1: die URL überschreiben und verwenden extra_context (SO dies vorgeschlagen)
- Das Problem ist, dass die Urls "Magie" sind, ist mein urlpatterns sehr einfach:

from material.frontend import urls as frontend_urls 
urlpatterns = [ 
    url(r'^MOC/', include('MOC.urls')), 
    url(r'', include(frontend_urls)), 
] 

die Urls Überschreibung selbst war WAY über meinen Kopf, ich habe mich eine Weile damit beschäftigt, aber es benutzt wirklich generische Funktionen, um Module zu ziehen usw. Ich hatte keine Ahnung, wie ich es überhaupt versuchen sollte.

Versuch 2: Überschreibe die Ansicht selbst und die Funktion get_context_data
Ich glaube, das wäre möglich, aber es scheint einfach nicht zu funktionieren. Meine Versuche, sah wie folgt aus (die neuesten eins):

from viewflow.flow.views.task import AssignTaskView as CoreAssignTaskView 

class AssignTaskView(CoreAssignTaskView): 
    def get_context_data(self, **kwargs): 
    context = super(AssignTaskView, self).get_context_data(**kwargs) 
    print("Did it work?") 
    return context 

Dies ist in meinem views.py - aber es einfach nicht laufen. Ich verpasse wahrscheinlich etwas, aber ich kann nicht herausfinden, wie man es wirklich zwingt, meine Ansicht anstelle von dem zu verwenden, das in viewflow eingebaut wird.

Ich habe die Viewflow-Templates erfolgreich überschrieben, aber es ist mir nicht möglich, etwas anderes zu überschreiben. Irgendwelche Vorschläge?

Antwort

0

Ja, Sie können tatsächlich einen Blick URL überschreiben, indem sie oben auf url_patterns

urlpatterns = [ 
    url(
     r'^/workflow/appname/flowname/(?P<process_pk>\d+)/taskname/(?P<task_pk>\d+)/assign/$', 
     YouCustomView.as_view(), 
     {'flow_task': FlowClass.taskname}, 
     name="{}__assign".format(self.name))) 
    ), 
    url(r'', include(frontend_urls)), 
] 

setzen Aber es ist einfacher nur eine benutzerdefinierte flow.View Unterklasse zu erstellen und Sie besitzen Assign Ansicht

https://github.com/viewflow/viewflow/blob/master/viewflow/flow/nodes.py#L306

from viewflow import flow 

class MyView(flow.View): 
     assign_view_class = MyAssignTaskView 

flows.py:

class MyFlow(Flow): 
    ... 
    taskname = MyView(UpdateProcessView).next(this.end) 

So können Sie eine der integrierten Ansichten überschreiben.

Viewflow entwickelt, um alle Knöpfe innerhalb Ihrer Codebasis zu liefern. Sie können jedes Verhalten anpassen, indem Sie Flow- oder Flow-Node-Klassen unterklassifizieren.

kann mit benutzerdefinierten Knoten Beispiel

https://github.com/viewflow/viewflow/blob/master/demo/customnode/nodes.py

hilfreich sein
Verwandte Themen