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
Python Django调用其他函数时发生UnbundLocalError_Python_Django_Urlconf - Fatal编程技术网

Python Django调用其他函数时发生UnbundLocalError

Python Django调用其他函数时发生UnbundLocalError,python,django,urlconf,Python,Django,Urlconf,不久前,我开始用Django编写Python。有时候我会犯一些奇怪的错误,我不知道为什么。那么,让我们从其中一个错误开始 我有一个具有两个功能的视图。例如: def view_post(request, slug): """ Shows a single post """ posts = Post.objects(slug = slug).limit(1) for items in posts: post = items cssC

不久前,我开始用Django编写Python。有时候我会犯一些奇怪的错误,我不知道为什么。那么,让我们从其中一个错误开始

我有一个具有两个功能的视图。例如:

def view_post(request, slug):
    """
    Shows a single post
    """
    posts = Post.objects(slug = slug).limit(1)
    for items in posts:
        post = items

    cssClasses = css_class_converter({ _css_class_editable })

    context = RequestContext(request)
    return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)

def new_post(request):
    '''
    Opens a blank page for creating a new post
    '''

    post = Post()
    cssClasses = css_class_converter({ _css_class_editable, _css_class_new })
    context = RequestContext(request)
    return render_to_response("single.html", {'post': post, 'new': True }, context)
然后用我的URLconf给他们打电话。调用view_post函数可以正常工作,没有错误

urlpatterns = patterns('blog.views',
    # Examples:
    url(r'^$', views.index),
    url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
    url(r'^new/$', 'new_post', name='new_blog_post'),

...
urlpatterns=patterns('blog.views',
#示例:
url(r'^$',views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
...
但是在第39行“赋值前引用的局部变量'post'”上,调用新的\u post函数在未绑定的LocalError异常中运行。第39行是视图函数的render\u to\u响应,而不是新函数

所以,为什么我对新函数的调用会在我的视图函数中抛出一个错误?真的,我不知道。我是从C#过来的,所以我确定我没有得到一些特殊的Python规则,这会使我编码错误

更新:由于stackoverflow.com代码面板的原因,这两个函数的缩进不正确。不必在意。


问题在于压痕

def view(request):
    ...
    def new(request):
        ...
python的不同之处在于:

def view(request):
    ...

def new(request):
    ...
您应该确保缩进使用空格,python建议使用4个空格而不是制表符

更新:

问题在于URL:

url(r'^$', views.index),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^$,views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
将其更改为:

url(r'^$', views.index),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^$,views.index),
url(r“^new/$”、“new_post”、name='new_blog_post'),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
这是因为url/new/exp与regexp匹配

r'^(?P<slug>[^\.]+)'
r'^(?P[^\.]+)'

问题在于缩进

def view(request):
    ...
    def new(request):
        ...
python的不同之处在于:

def view(request):
    ...

def new(request):
    ...
您应该确保缩进使用空格,python建议使用4个空格而不是制表符

更新:

问题在于URL:

url(r'^$', views.index),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^$,views.index),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
url(r“^new/$”、“new_post”、name='new_blog_post'),
将其更改为:

url(r'^$', views.index),
url(r'^new/$', 'new_post', name='new_blog_post'),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),
url(r'^$,views.index),
url(r“^new/$”、“new_post”、name='new_blog_post'),
url(r'^(?P[^\.]+),'view_post',name='view_blog_post'),
这是因为url/new/exp与regexp匹配

r'^(?P<slug>[^\.]+)'
r'^(?P[^\.]+)'

这个错误听起来很像是调用了
查看\u post
查看函数。你确定你的URL模式正确吗?或者两个URL正则表达式都可以指向
查看\u post

view\u post
中,如果查询未找到任何项,则仅在for循环中设置的变量
post
将不会被设置,并且
render\u to\u response
中对该变量的引用将引发
UnboundLocalError

通过在循环之前将post设置为None,可以避免这种情况

def view_post(request, slug):
        """
        Shows a single post
        """
        posts = Post.objects(slug = slug).limit(1)
        post = None   # Ensure post is bound even if there are no posts matching slug
        for items in posts:
            post = items

        cssClasses = css_class_converter({ _css_class_editable })

        context = RequestContext(request)
        return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)
您可以使用以下更简单的函数了解发生UnboundLocalError的原因:

def first_element(items):
    for item in items:
        result = item
        break
    return result
(显然,您不会像这样真正实现
first\u元素,但这说明了发生了什么。)
如果使用非空列表调用
first\u元素
,它将按预期工作:

>>> first_element([2, 3, 4])
2
但如果使用空列表调用,则结果从未绑定,因此您将得到错误:

>>> first_element([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in first_element
UnboundLocalError: local variable 'result' referenced before assignment
>>第一个元素([])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在第一个元素中
UnboundLocalError:赋值前引用的局部变量“result”

这个错误听起来很像是调用了
查看\u post
查看函数。你确定你的URL模式正确吗?或者两个URL正则表达式都可以指向
查看\u post

view\u post
中,如果查询未找到任何项,则仅在for循环中设置的变量
post
将不会被设置,并且
render\u to\u response
中对该变量的引用将引发
UnboundLocalError

通过在循环之前将post设置为None,可以避免这种情况

def view_post(request, slug):
        """
        Shows a single post
        """
        posts = Post.objects(slug = slug).limit(1)
        post = None   # Ensure post is bound even if there are no posts matching slug
        for items in posts:
            post = items

        cssClasses = css_class_converter({ _css_class_editable })

        context = RequestContext(request)
        return render_to_response("single.html", { 'post': post, 'class': cssClasses }, context)
您可以使用以下更简单的函数了解发生UnboundLocalError的原因:

def first_element(items):
    for item in items:
        result = item
        break
    return result
(显然,您不会像这样真正实现
first\u元素,但这说明了发生了什么。)
如果使用非空列表调用
first\u元素
,它将按预期工作:

>>> first_element([2, 3, 4])
2
但如果使用空列表调用,则结果从未绑定,因此您将得到错误:

>>> first_element([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in first_element
UnboundLocalError: local variable 'result' referenced before assignment
>>第一个元素([])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在第一个元素中
UnboundLocalError:赋值前引用的局部变量“result”

示例代码中的缩进是不一致的-如果在实际代码中是这样的话,事情就不会像你期望的那样。是的,谢谢,我知道,但这只是因为堆栈溢出:p示例代码中的缩进是不一致的-如果在实际代码中是这样的话,事情就不会像你期望的那样。是的,谢谢,我不知道但这只是因为堆栈溢出:PNo,不是这样。这只是因为我复制的代码非常难看。它在原始版本中没有问题。它不会引发缩进错误而不是引用错误吗?不太可能,在python中,你可以在funcsYes中定义funcs,我知道。但正如我所说,它在我的文件中是正确的。我的编辑中没有缩进或者。这只是因为这里的代码面板。我将添加一个屏幕截图来澄清这一点。我更新了我的问题并添加了一个屏幕截图。我确定这不是缩进问题。是吗?哦,该死,你对URLconf的看法太正确了。我永远不会想到。谢谢老兄,这可能是解决我许多问题的方法:DNo,不是我t、 这只是因为我复制的代码非常难看。它在原始版本中还可以。它不会引发缩进错误而不是引用错误吗?不太可能,在python中,你可以在funcsYes中定义funcs,我知道