django:如何将变量传递给类?
问题描述:
urls.pydjango:如何将变量传递给类?
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/',而是 '名' 是无...
如何获得'姓名'? 我该怎么办?
编辑-----
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' ......
我该怎么办?
答
您应该可以通过self.kwargs['name']
访问该参数。此外,get_queryset
应该返回一个查询集。
你还需要使用pk
,而不是name
在您的网址,如果你想使用DetailView
通用视图。之后,您只需要在customerDetailView
类中定义model = Customer
和slug_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'])
无需在您的班级中修改slug_field
和slug_url_kwarg
。
我已经更新了解决第二个问题的答案。 – 2013-02-09 12:52:55