Django基于类的视图:如何将其他parameter passing给as_view方法?

我有一个自定义的基于类的视图

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

我想要像这样传入slug参数(或其他参数)

 MyView.as_view(slug='hello_world') 

我是否需要重写任何可以执行此操作的方法?

如果你的urlconf看起来像这样:

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

那么在你的视图函数(比如'get_queryset')中可以使用slug:

 self.kwargs['slug'] 

传递给as_view方法的每个参数都是View类的实例variables。 这意味着添加slug as作为一个参数,你必须创build它作为一个实例variables在你的子类:

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

这应该使MyView.as_view(slug='hello_world')工作。

如果您通过关键字传递variables,请使用Erikkson先生的build议: https ://stackoverflow.com/a/11494666/9903

值得注意的是,您不需要重写get_object()以查找基于作为关键字arg传递的slug的对象 – 您可以使用SingleObjectMixin的属性https://docs.djangoproject.com/en/ 1.5 / REF /类为主的视图/混入单对象/#singleobjectmixin

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

slug_fieldslug_url_kwarg默认为'slug'

如果要将对象添加到模板的上下文中,可以覆盖get_context_data并将其添加到上下文中。 如果您需要request.user ,请求也是自己的一部分。

 def get_context_data(self, **kwargs): context = super(MyTemplateView, self).get_context_data(**kwargs) if 'slug' in self.kwargs: context['object'] = get_object_or_404(MyObject, slug=self.kwargs['slug']) context['objects'] = get_objects_by_user(self.request.user) return context 

您可以从urls.py传递参数https://docs.djangoproject.com/en/1.7/topics/http/urls/#passing-extra-options-to-view-functions

这也适用于通用视图。 例:

 url(r'^$', views.SectionView.as_view(), { 'pk': 'homepage', 'another_param':'?'}, name='main_page'), 

在这种情况下,传递给视图的参数不一定是View类的实例variables。 使用此方法,您不需要将默认页面名称硬编码到YourView模型中,但可以将其作为来自urlconf的parameter passing。

如Yaroslav Nikitenko所述 ,如果您不想将新的实例variables硬编码到View类,则可以传递额外的选项来查看来自urls.py 函数 ,如下所示:

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

我只是想添加如何从视图中使用它。 您可以实施以下方法之一:

 # 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