2013-02-09 17 views
1
class customerDetailView(DetailView): 
    queryset = Customer.objects.get(name=self.name) # This line give error NameError: name 'self' is not defined 
    context_object_name = 'customerDetail' 
    template_name = "customer.html" 
    allow_empty = True 

    def __init__(self, name=None, *args): 
     self.name = name 

给出了一个错误NameError:名字“自我”是没有定义名“自我”是没有定义

+2

你认为它应该从哪里得到“自我”? – 2013-02-09 10:32:25

+1

您在调用__init__之前使用self。 – Amelia 2013-02-09 10:36:31

+0

http://stackoverflow.com/questions/6008808/how-to-do-a-detailview-in-django-1-3 – catherine 2013-02-09 10:45:43

回答

3

由于您想要自定义DetailView的查询集,因此正确的方法是覆盖get_queryset()函数。请参阅显示方法解析顺序的documentation for DetailView。特别是,调用get_queryset()

所以,你的代码将成为这个:

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

    def __init__(self, name=None, *args): 
     self.name = name 

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

你不能在你的方式使用self因为self没有在类的声明存在,则创建类的实例只有当。

+0

噢,打我吧。我刚打开我的笔记本电脑来编写代码!从我+1。 – 2013-02-09 11:00:18

3

你应该把你的初始化代码里面​​__init__,而不是类体:

class CustomerDetailView(DetailView): 
    def __init__(self, name=None): 
     self.name = name 
     self.queryset = Customer.objects.get(name=self.name, None) 
     self.context_object_name = 'customerDetail' 
     self.template_name = "customer.html" 
     self.allow_empty = True 
    # stuff 

另外,作为一个无关的旁注,您的代码使用了三种不同风格的组合。尝试阅读PEP8

+1

这是不正确的,大部分代码应该停留在初始化之外。查看奥斯汀答案中提到的文档。 – 2013-02-09 11:03:47

+0

@AidanEwen啊,我现在看到了。我对django不是非常熟悉;我从python的角度回答。 – Amelia 2013-02-09 11:32:18

+1

爱PEP8链接 - 我最近开始使用pydevd的PEP8检查器 - 这让人大开眼界! – 2013-02-09 12:02:29