Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
视图在Python3中不存在,但在Python2中存在_Python_Django_Python 3.x - Fatal编程技术网

视图在Python3中不存在,但在Python2中存在

视图在Python3中不存在,但在Python2中存在,python,django,python-3.x,Python,Django,Python 3.x,我的views.py中有以下代码: def view1(request): # do view1-y things return view_common(request, mode=True) def view2(request): # do view2-y things return view_common(request, mode=False) # not registered in urls.py def view_common(request, mode):

我的views.py中有以下代码:

def view1(request):
  # do view1-y things
  return view_common(request, mode=True)

def view2(request):
  # do view2-y things
  return view_common(request, mode=False)

# not registered in urls.py
def view_common(request, mode):
   return render(...)

这在Python3下不起作用,导致“视图不存在”错误。如何解决这个问题?

问题在于Python解释视图的方式

执行查看方法
view1
时,
view\u common
仍不在上下文中。这就是问题所在。将助手方法移动到视图之前,使其处于上下文中。这将解决这个问题

下面是一个演示:

假设有一个python文件,
test.py

x = add_three(2, 3, 4)
print (x)

def add_three(x, y, z):
    return plus(plus(x, y), z)

def plus(x, y):
    return x + y
输出:

$:~$ python3 test.py 
Traceback (most recent call last):
  File "test1.py", line 1, in <module>
    x = add_three(2, 3, 4)
NameError: name 'add_three' is not defined

输出与预期一致。请注意,
plus
在从
add\u three
调用时已经在上下文中。因此它不会失败。

请发布回溯。您是否尝试将
view\u common
移到
view1
上方?@karthikr:这很有帮助,谢谢。把它作为答案贴出来,我会接受的。你的问题毫无意义。发布的代码在3.5中运行良好。对于此代码,该错误消息可能不是来自Python的。代码中没有名称
视图
。请参阅。方法是作为类属性的函数<代码>视图1等是函数,但不是方法。发布的代码从不调用任何函数,并且在3.x中运行良好,因此没有显示错误进行解释。函数在调用之前必须存在或定义这一事实在2.x和3.x之间没有变化。“当执行视图方法view1时,视图公共项仍然不在上下文中。”除非在
def view\u common()
之前的模块级执行视图,否则这一事实毫无意义。另外,
x=add_three(…)
也会以同样的原因失败,但这并不是因为未定义的
plus
。您是否了解为什么它在Python 2而不是3中工作?我想这是某种Django的古怪,但这是个好消息。
def add_three(x, y, z):
    return plus(plus(x, y), z)

def plus(x, y):
    return x + y

x = add_three(2, 3, 4)
print (x)