2016-07-14 10 views
0

Ich entwickle eine Django-Anwendung, die von Leuten in verschiedenen Unternehmen verwendet wird. Einige Unternehmen benötigen stark angepasste Ansichten, was bedeutet, dass ich die Standardvorlage je nach Bedarf ändern werde. Es könnte auch einige zusätzliche Kontextvariablen erfordern.Django: Rückgabe einer benutzerdefinierten Ansichtsfunktion

Meine Idee ist, separate Ansichtsfunktionen wie erforderlich zu erstellen, da der Versuch, alles in eine Ansicht zu bringen, ziemlich schnell unordentlich wird. Zum Beispiel, sagen wir mal ich eine Dashboard-Ansicht haben:

def dashboard(request): 
    var1 = some_func() 
    context = {'var1': var1 } 
    return render(request, 'normal_template.html', context) 

Jetzt will Unternehmen x eine benutzerdefinierte Armaturenbrett:

def dashboard_for_company_x(request): 
    var1, var2 = some_func_x() 
    context = {'var1': var1, 'var2': var2 } 
    return render(request, 'template_for_x.html', context) 

Also, wenn ein Benutzer von der Firma x zu einer bestimmten Seite geht, dashboard_for_company_x verwendet werden soll . Alle anderen Benutzer sollten die ursprüngliche Dashboard-Funktion verwenden. Die zwei Optionen, die ich mir vorstellen kann, sind entweder: 1. Hinzufügen des Firmennamens zur URL, so dass der URL-Resolver die korrekte View-Funktion verwendet.

2. Verwenden Sie Middleware, um die Anforderung abzufangen und bei Bedarf an die entsprechende Ansichtsfunktion umzuleiten.

1 scheint wie die bessere Option, aber es würde bedeuten, dass ich alle URL-Tags in meiner Vorlage ändern würde, um den Firmennamen aufzunehmen, so dass das nicht wirklich eine Option ist. Ich denke, 2 wird funktionieren, scheint aber ein bisschen wie ein Hack zu sein.

Ist es in Ordnung, Nummer 2 zu verwenden, oder gibt es bessere Optionen?

Beachten Sie, dass nur ein kleiner Prozentsatz der Ansichten angepasst werden muss.

Antwort

1

Sie das Routing innerhalb Ihrer Ansicht Funktion tun könnten, zum Beispiel:

def dashboard(request): 
    if request.user.company == 'foo': 
     return dashboard_foo(request) 
    elif request.user.company == 'bar': 
     return dashboard_bar(request) 
    else: 
     return dashboard_standard(request) 

auf der Komplexität Ihrer Ansicht Je könnte es sinnvoll, ein class based view zu bedienen, so dass Sie nur die spezifische Logik auslagern müssen (zB: templates, context vars, etc.) in den spezifischen Methoden, und die Hauptlogik sollte für alle Benutzer gleich sein (dh: Code Duplikation reduzieren).

Verwandte Themen