Ошибка определенно звучит так, как будто вызывается функция просмотра view_post
.Вы уверены, что ваши urlpatterns правильные пути?Или оба регулярных выражения URL могут указывать на view_post
.
В view_post
, если запрос не находит элементов, тогда переменная post
, заданная только в цикле for, не будет установлена, иссылка на него в render_to_response
вызовет UnboundLocalError
.
. Этого можно избежать, установив в столбце 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