Django class-based view: How do I pass additional parameters to the as_view method? Django class-based view: How do I pass additional parameters to the as_view method? python python

Django class-based view: How do I pass additional parameters to the as_view method?


If your urlconf looks something like this:

url(r'^(?P<slug>[a-zA-Z0-9-]+)/$', MyView.as_view(), name = 'my_named_view')

then the slug will be available inside your view functions (such as 'get_queryset') like this:

self.kwargs['slug']


Every parameter that's passed to the as_view method is an instance variable of the View class. That means to add slug as a parameter you have to create it as an instance variable in your sub-class:

# myapp/views.pyfrom django.views.generic import DetailViewclass MyView(DetailView):    template_name = 'detail.html'    model = MyModel    # additional parameters    slug = None    def get_object(self, queryset=None):        return queryset.get(slug=self.slug)

That should make MyView.as_view(slug='hello_world') work.

If you're passing the variables through keywords, use what Mr Erikkson suggested: https://stackoverflow.com/a/11494666/9903


It's worth noting you don't need to override get_object() in order to look up an object based on a slug passed as a keyword arg - you can use the attributes of a SingleObjectMixin https://docs.djangoproject.com/en/1.5/ref/class-based-views/mixins-single-object/#singleobjectmixin

# views.pyclass MyView(DetailView):    model = MyModel    slug_field = 'slug_field_name'    slug_url_kwarg = 'model_slug'    context_object_name = 'my_model'# urls.pyurl(r'^(?P<model_slug>[\w-]+)/$', MyView.as_view(), name = 'my_named_view')# mymodel_detail.html{{ my_model.slug_field_name }}

(both slug_field and slug_url_kwarg default to 'slug')