Ich habe eine benutzerdefinierte klassenbasierte Ansicht
# myapp/views.py
from django.views.generic import *
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
Ich möchte den Slug-Parameter (oder andere Parameter an die Ansicht) wie folgt übergeben
MyView.as_view(slug='hello_world')
Muss ich Methoden überschreiben, um dies zu tun?
self.kwargs.get('slug', None)
class View: def as_view(cls, **initkwargs): def view(request, *args, **kwargs):
url('<slug:slug>', MyView.as_view(), name='my_named_view')
Jeder Parameter, der an die
as_view
Methode übergeben wird, ist eine Instanzvariable der View-Klasse. Das heißt, umslug
als Parameter hinzuzufügen , müssen Sie ihn als Instanzvariable in Ihrer Unterklasse erstellen:Das sollte
MyView.as_view(slug='hello_world')
funktionieren.Wenn Sie die Variablen über Schlüsselwörter übergeben, verwenden Sie die Vorschläge von Herrn Erikkson: https://stackoverflow.com/a/11494666/9903
quelle
import *
. Habe deinen Beitrag bearbeitet.Es ist erwähnenswert, dass Sie nicht überschreiben
get_object()
müssen, um ein Objekt basierend auf einem als Schlüsselwort arg übergebenen Slug nachzuschlagen. Sie können die Attribute vonSingleObjectMixin
https://docs.djangoproject.com/en/1.5/ref/ verwenden. klassenbasierte Ansichten / mixins-single-object / # singleobjectmixin(beides
slug_field
undslug_url_kwarg
standardmäßig'slug'
)quelle
Wenn Sie dem Kontext für die Vorlage ein Objekt hinzufügen möchten, können Sie diesen überschreiben
get_context_data
und zu seinem Kontext hinzufügen. Die Anfrage ist auch ein Teil von self, falls Sie die request.user benötigen .quelle
MyObject
?Sie können Parameter von urls.py https://docs.djangoproject.com/de/1.7/topics/http/urls/#passing-extra-options-to-view-functions übergeben
Dies funktioniert auch für allgemeine Ansichten. Beispiel:
In diesem Fall sollten die an die Ansicht übergebenen Parameter nicht unbedingt Instanzvariablen der View-Klasse sein. Mit dieser Methode müssen Sie den Standardseitennamen nicht fest in Ihr YourView-Modell codieren, sondern können ihn einfach als Parameter von urlconf übergeben.
quelle
Wie durch erklärte Jaroslaw Nikitenko , wenn Sie nicht, eine neue Instanz Variable in die View - Klasse hart codieren möchten , können Sie zusätzliche Optionen übergeben Funktionen anzuzeigen aus
urls.py
wie folgt aus :Ich wollte nur hinzufügen, wie man es aus der Ansicht verwendet. Sie können eine der folgenden Methoden implementieren:
quelle
DetailView
Klasse. Können Sie erklären, wie man es dort benutzt?Für Django 3.0 hat das bei mir funktioniert:
quelle