2017-09-19 2 views
0

In meiner Django-App habe ich eine Reihe generischer Ansichten (Erstellen, Aktualisieren, Löschen, Detail, Liste), von denen die meisten meiner tatsächlichen Ansichten erben. Alle diese Ansichten fügen dem Kontext eine Reihe von nützlichen Informationen hinzu (die Namen des Plurals, der URLs zum Erstellen, Auflisten usw.). Aber die Ansichten mehr oder weniger alle den gleichen Code duplizieren. Aus diesem Grund möchte ich diese Dinge in einen Kontext-Prozessor verschieben und die Code-Duplizierung entfernen.Zugriff auf Modell-/Klasseninformationen im Kontextprozessor

Mein Problem ist, ich kann nicht scheinen, die Dinge zu bestimmen, die ich von der Anfrage benötigen würde, die an den Kontextprozessor (dh: wenn ich auf die Modellinstanz, Modellklasse, Formularklasse usw. zugreifen könnte), dann Es geht mir gut. Der folgende Code zeigt, wie die get_context_data in den Ansichten aussieht - wie würde ich das in einem Kontextprozessor replizieren?

Danke.

def get_context_data(self, **kwargs): 
    """Passes context variables to the HTML templates.""" 
    context = super(CodexAnonDetailView, self).get_context_data(**kwargs) 
    context['model_name'] = model_ngettext(self.model, 1) 
    context['model_name_plural'] = model_ngettext(self.model, 2) 
    context['object_create_url'] = reverse('%s:%s_create' % (resolve(self.request.path).app_name, self.model.__name__)) 
    context['model_list_url'] = reverse('%s:%s_list' % (resolve(self.request.path).app_name, self.model.__name__)) 

Antwort

0

Die Schönheit von Djangos Klasse basierte Ansichten ist, dass Sie die Vorteile der Klassenvererbung nehmen kann mitbenutzt Funktionalität

Definieren Sie eine Klasse zu implementieren, die das Verhalten implementiert Sie benötigen und dann erben sowohl von der generischen Ansichtsklasse und Ihr Mixin

class MyMixin(object): 

    def get_context_data(self, **kwargs): 
     context = super(MyMixin, self).get_context_data(**kwargs) 
     context['model_name'] = model_ngettext(self.model, 1) 
     context['model_name_plural'] = model_ngettext(self.model, 2) 
     context['object_create_url'] = reverse('%s:%s_create' % (resolve(self.request.path).app_name, self.model.__name__)) 
     context['model_list_url'] = reverse('%s:%s_list' % (resolve(self.request.path).app_name, self.model.__name__)) 
     return context 


class MyCreateView(MyMixin, CreateView): 

    model = MyModel