-->

基于类的Django的观点:我如何将其他参数传递到as_view方法?(Django class-b

2019-06-17 10:48发布

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

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

我想在蛞蝓参数(或其它参数的视图)来传递这样

MyView.as_view(slug='hello_world')

我需要重写任何方法可以做到这一点?

Answer 1:

如果你的URLconf看起来是这样的:

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

然后蛞蝓将可用内部视图的功能(如“get_queryset”)是这样的:

self.kwargs['slug']


Answer 2:

则传递给每一个参数as_view方法是View类的实例变量。 这意味着添加slug ,你必须创建它在你的子类的实例变量的参数:

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

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')工作。

如果你通过关键字传递变量,使用什么Erikkson先生建议: https://stackoverflow.com/a/11494666/9903



Answer 3:

值得一提的,你不需要重写get_object()以查找基于作为关键字ARG通过了塞的对象-您可以使用的属性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'



Answer 4:

如果你想将一个对象添加到上下文的模板,你可以覆盖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


Answer 5:

您可以从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类的实例变量。 使用这种方法,你不需要硬编码的默认页面名称为YourView模式,但你可以把它作为从URL配置参数。



Answer 6:

正如指出雅罗斯拉夫Nikitenko ,如果你不想硬编码一个新的实例变量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


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