【问题标题】:name 'self' is not defined名称“自我”未定义
【发布时间】:2013-01-25 01:55:39
【问题描述】:
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: name 'self' is not defined

【问题讨论】:

标签: python django python-2.x


【解决方案1】:

您应该将初始化代码放在 __init__ 中,而不是 Class 正文中:

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

【讨论】:

  • 这不太正确,大部分代码应该保留在 init 之外。请参阅 Austin 的答案中引用的文档。
  • @AidanEwen 啊,我现在明白了。我对 django 不是很熟悉。我是从python的角度回答的。
  • 喜欢 PEP8 链接 - 我最近开始使用 pydevd 的 PEP8 检查器 - 这让我大开眼界!
【解决方案2】:

由于您想要自定义 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在类声明中不存在,只有在创建类的实例时。

【讨论】:

  • d'oh,打败我。我刚刚打开我的笔记本电脑来编写那个代码!来自我的 +1。
猜你喜欢
  • 2014-10-10
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多