首页 文章

django:如何将变量传递给类?

提问于
浏览
1

urls.py

url(r'^customer/(?P<name>[^\s]+)/$', customerDetailView.as_view(), name="customerDetailView"), #pass 'name' variable

views.py

class customerDetailView(DetailView):
    context_object_name = 'customerDetail'
    template_name = "customer.html"
    allow_empty = True

    def __init__(self, name=None, *args):
        self.name = name # name is 'None'... Why...?

    def get_queryset(self):
        return Customer.objects.get(name=self.name)

我只是要求'192.168.1.5/customer/abc/',但'name'是没有......

如何收到'姓名'?我该怎么办?

编辑 - - -

views.py

class customerDetailView(DetailView):
    context_object_name = 'customerDetail'
    template_name = "customer.html"
    allow_empty = True
    """
    def __init__(self, **kwargs):
        import pdb;pdb.set_trace()
        self.name = kwargs['name']
    """
    def get_queryset(self):
        # import pdb;pdb.set_trace()
        self.name = self.kwargs['name'] # Thanks  Kay Zhu!!
        return Customer.objects.get(name=self.name)

我申请你回答的代码 .

然后,我收到一个错误

Generic detail view customerDetailView must be called with either an object pk or a slug.

所以我需要'pk'......

我该怎么办?

1 回答

  • 1

    您应该能够使用 self.kwargs['name'] 访问该参数 . 此外, get_queryset 应该返回一个查询集 .

    如果要使用 DetailView 泛型视图,还需要在URL中使用 pk 而不是 name . 之后,您只需要在 customerDetailView 类中定义 model = Customerslug_field = 'name' ,它应该可以工作 . 您根本不需要访问 self.kwargs['name'] . [source]

    如果您确实想在URL中使用 <name> ,还需要将 slug_url_kwarg 更改为 name (除了 slug_field = 'name'

    class customerDetailView(DetailView):
        context_object_name = 'customerDetail'
        template_name = "customer.html"
        allow_empty = True
        model = Customer
        slug_field = 'name'
        slug_url_kwarg = 'name'
        # no need to override any methods here
    

    或覆盖 get_object

    def get_object(self):
        return get_object_or_404(Customer, name=self.kwargs['name'])
    

    无需修改 class 中的 slug_fieldslug_url_kwarg .

相关问题