113 votes

Vue de Django basée sur les classes : Comment passer des paramètres supplémentaires à la méthode as_view ?

J'ai une vue personnalisée basée sur des classes

# 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)

Je veux passer dans le paramètre slug (ou d'autres paramètres à la vue) comme ceci

MyView.as_view(slug='hello_world')

Dois-je modifier certaines méthodes pour pouvoir le faire ?

9voto

emileb Points 614

Comme indiqué par Yaroslav Nikitenko Si vous ne voulez pas coder en dur une nouvelle variable d'instance dans la classe View, vous pouvez utiliser les méthodes suivantes passer des options supplémentaires aux fonctions de visualisation de urls.py comme ça :

url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')

Je voulais juste ajouter comment l'utiliser depuis la vue. Vous pouvez implémenter l'une des méthodes suivantes :

# If slug is optional
def the_function(self, request, slug=None):
    # use slug here

# if slug is an optional param among others
def the_function(self, request, **kwargs):
    slug = kwargs.get("slug", None)
    other_param = kwargs.get("other_param", None)

# If slug is required
def the_function(self, request, slug):
    # use slug here

4voto

mizerablebr Points 767

Pour django 3.0, voici ce qui a fonctionné pour moi :

# myapp/views.py
from django.views.generic import DetailView

class MyView(DetailView):
    template_name = 'detail.html'
    slug = None

    def get_object(self, queryset=None):
        self.slug = self.kwargs.get('slug', None)
        return queryset.get(slug=self.slug)

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('slug/<slug:slug>/', views.MyView.as_view(), name='myview_by_tag'),
]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X