Django:UnboundLocalError:分配前引用的局部变量“公司”

Posted

技术标签:

【中文标题】Django:UnboundLocalError:分配前引用的局部变量“公司”【英文标题】:Django: UnboundLocalError: local variable 'company' referenced before assignment 【发布时间】:2019-03-07 06:46:17 【问题描述】:

我正在尝试通过在其中传递两个主键来在我的详细视图中创建一个 url 字段...

这是我在 urls.py 中所做的:

    url(r'^company/(?P<pk1>\d+)/groupdetail/(?P<pk2>\d+)/$',views.group1DetailView.as_view(),name='groupdetail'),

在我看来:

    def get_object(self):
        pk1 = self.kwargs['pk1']
        pk2 = self.kwargs['pk2']
        company = get_object_or_404(company, pk=pk1)
        group1 = get_object_or_404(group1, pk=pk2)
        return group1

我在这一行遇到错误:

company = get_object_or_404(company, pk=pk1)

在我的 group1 列表视图中,我已经这样做了:

<a href="% url 'accounting_double_entry:groupdetail' pk1=company_details.pk pk2=group1_details.pk %">group1.group_Name</a>

谁能告诉我这段代码我做错了什么?

谢谢

【问题讨论】:

类名和变量名一样,所以Python认为company是一个局部变量。 是的,这解决了问题...但是为什么它在两种情况下都重复相同的主键号... 什么意思?它们使用不同的主键(尽管这些可以是相同的,因为id“序列”默认情况下都从1开始,并且递增)。在这里,您只执行引发 404 的功能,这相当“异国情调”:) 假设我点击一个 ID 为 2 的公司内 ID 为 3 的组...它只读取公司 ID 并使组 ID 为 2...序列应该是公司/2/groupdetail/3 但它即将到来的公司/2/groupdetail/2 因为你写的是pk2=group1_details.pk,而不是pk2=group1.pk 【参考方案1】:

在你的函数中,你赋值给一个名为company的变量,所以Python认为company是一个局部变量,但此时未赋值,所以你需要使用另一个变量避免这种情况的名称:

def get_object(self):
    pk1 = self.kwargs['pk1']
    pk2 = self.kwargs['pk2']
    # make sure the variable name is different than the model name
    company_obj = get_object_or_404(company, pk=pk1)
    group1_obj = get_object_or_404(group1, pk=pk2)
    return group1_obj

由于您在这里不使用company_obj,您可能希望删除变量名:

def get_object(self):
    pk1 = self.kwargs['pk1']
    pk2 = self.kwargs['pk2']
    get_object_or_404(company, pk=pk1)
    group1_obj = get_object_or_404(group1, pk=pk2)
    return group1_obj

作为替代方案,如果您的 group1company“相关”,并且您想检查这是否成立,则过滤该公司是有意义的:

def get_object(self):
    pk1 = self.kwargs['pk1']
    pk2 = self.kwargs['pk2']
    company_obj = get_object_or_404(company, pk=pk1)
    group1_obj = get_object_or_404(group1, pk=pk2, company=company_obj)
    return group1_obj

注意PEP-8 [Python-doc]建议类名写在CamelCase中,而字段和局部变量写在lower_case中>。像some_class = SomeClass() 这样的东西并不少见,所以因为驼峰式大小写以大写开头,局部变量和类之间的冲突永远不会存在。

【讨论】:

以上是关于Django:UnboundLocalError:分配前引用的局部变量“公司”的主要内容,如果未能解决你的问题,请参考以下文章

Django:UnboundLocalError:在赋值之前引用的局部变量'company'

分配前引用的 /blog/search/ 局部变量 'cd' 处的 UnboundLocalError

UnboundLocalError:分配前引用的局部变量“光标”

Python 3:UnboundLocalError:分配前引用的局部变量[重复]

UnboundLocalError

不明白为啥会发生 UnboundLocalError(关闭)[重复]