0

少し前に、Django で Python のプログラミングを始めました。ときどき奇妙なエラーが発生し、その理由がわかりません。それでは、これらのエラーの 1 つから始めましょう。

私は2つの機能を持つビューを持っています。例:

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'),

...

ただし、new_post 関数を呼び出すと、39 行目の "local variable 'post' referenced before assignment"で UnboundLocalError Exception が発生します。39行目はview関数のrender_to_responseであり、new関数ではありません。

では、新しい関数の呼び出しがビュー関数でエラーをスローするのはなぜですか? 本当に、私には手がかりがありません。私は C# からやってきたので、コーディングを間違ったものにする特別な Python ルールを取得していないと確信しています。

更新: stackoverflow.com コード パネルが原因で、2 つの関数のインデントが正しくありません。気にしないでください。

ここに画像の説明を入力

4

2 に答える 2

3

問題はインデント

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'^new/$', 'new_post', name='new_blog_post'),
url(r'^(?P<slug>[^\.]+)', 'view_post', name='view_blog_post'),

これは、URL /new/ が正規表現と一致するためです

r'^(?P<slug>[^\.]+)'
于 2011-11-16T21:28:56.303 に答える
1

view_postビュー関数が呼び出されているように、エラーは間違いなく聞こえます。あなたの urlpatterns が正しい方法であると確信していますか? または、両方の URL 正規表現が を指している可能性がありますview_post

view_postクエリで項目が見つからない場合、 for ループでのみ設定されている変数はpost設定されておらず、 での変数への参照render_to_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_elementが、これは何が起こっているかを示しています。)first_element空でないリストで呼び出すと、期待どおりに機能します。

>>> 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
于 2011-11-16T21:34:57.203 に答える