Ich habe eine Ansicht, wo ich Informationen über eine bestimmte Modellinstanz anzeigen muss, daher verwende ich eine DetailView
. Ich brauche auch dieselbe Ansicht, um ein normales Formular (kein Modellformular) zu behandeln, beide zeigen das Formular unter GET
an und validieren es unter POST
. Um dies zu tun, ich versuche, ein FormView
zu verwenden, aber die Kombination beide Ansicht clases nicht funktioniert:Django kombinieren Detailansicht und FormView
class FooView(FormView, DetailView):
# configs here
In GET
(zur Vereinfachung der Frage zeige ich nur das Problem mit GET
seit POST
hat eine andere Problem), es funktioniert nicht, da das Formular nie zum Kontext hinzugefügt wird. Der Grund hat mit der Methode Auflösung, um für diese Klasse zu tun:
>>> inspect.getmro(FooView)
(FooView,
django.views.generic.edit.FormView,
django.views.generic.detail.DetailView,
django.views.generic.detail.SingleObjectTemplateResponseMixin,
django.views.generic.base.TemplateResponseMixin,
django.views.generic.edit.BaseFormView,
django.views.generic.edit.FormMixin,
django.views.generic.detail.BaseDetailView,
django.views.generic.detail.SingleObjectMixin,
django.views.generic.base.ContextMixin,
django.views.generic.edit.ProcessFormView,
django.views.generic.base.View,
object)
Innerhalb der Anfrage hat Django die Form zu erhalten und es auf den Kontext hinzufügen. Das geschieht in ProcessFormView.get
:
def get(self, request, *args, **kwargs):
"""
Handles GET requests and instantiates a blank version of the form.
"""
form_class = self.get_form_class()
form = self.get_form(form_class)
return self.render_to_response(self.get_context_data(form=form))
jedoch die erste Klasse mit dem MRO die get
hat definiert ist BaseDetailView
:
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
Wie Sie die BaseDetailView.get
nie super
Anrufe sehen daher die ProcessFormView.get
nie daher aufgerufen werden Das Formular wird nicht zum Kontext hinzugefügt. Dies kann durch Erstellen einer Mischansicht behoben werden, in der all diese Nuancen für GET
und POST
berücksichtigt werden können, aber ich halte es nicht für eine saubere Lösung.
Meine Frage: Gibt es irgendeinen Weg, um das zu erreichen, was ich mit Djangos Standard-CBV-Implementierung erreichen möchte, ohne irgendwelche Mixins zu erstellen?
Warum möchten Sie keine Mixins verwenden? https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#using-formmixin-with-detailview –
Dies scheint wie eine einfache Aufgabe, die Build-in CBV sollte behandeln. – miki725