分配前在/本地变量'Profile'处引用了UnboundLocalError

时间:2018-12-27 15:25:23

标签: python django django-models django-views

我正在编写django视图,如下所示:-

def feed(request):
if request.user.is_authenticated:
    user=request.user
    profile=Profile.objects.filter(user=user)
    userfollowing=FollowingProfiles.objects.filter(Profile=profile)
    for following in userfollowing:
        username=following.ProfileName
        useraccount=User.objects.filter(username=username)
        Profile=Profile.objects.filter(user=useraccount)
        Post=post.objects.filter(Profile=Profile)
        comment=comment.objects.filter(post=Post)
        final_post_queryset=final_post_queryset+Post
        final_comment_queryset=final_comment_queryset+comment
    return render(request,'feed/feed.html',{'final_comment_queryset':final_comment_queryset,'final_post_queryset':final_post_queryset})
else:
    redirect('signup')

而模板feed.html是:-

{% extends 'base.html' %}
{% block content %}
{% load static %}

{% for p in final_post_queryset %}
   {{ p.DatePosted }}
   <img src="{{ p.Picture.url }}"/>
{% endblock %}

,而错误是:

所以错误出现在第三视角

profile=Profile.objects.filter(user=user)

1 个答案:

答案 0 :(得分:0)

我假设您已经导入了Profile模块(使用from .models import Profile等),并且对为什么它不存在感到困惑(如果您不存在,则需要将该导入添加到文件顶部。

即使您已导入它,此代码也无法使用。您的问题是在函数作用域中将其分配给名称Profile,使其成为局部变量,并且局部变量在函数开头中是局部的(但最初为空)。在分配它们之前尝试访问它们会引发UnboundLocalError(您看到的错误(当您尝试在分配给它之前从本地名称读取)时,只会出现 错误;不能仅通过未能导入模块来提高它,而只需引入NameError)。即使您 did 导入了全局导入的Profile,也看不到它,因为在函数中,Profile必须是本地的或全局的,不能两者都存在。

要解决此问题,请为您的局部变量选择其他名称,以使全局Profile仍可访问:

def feed(request):
    if request.user.is_authenticated:
        user=request.user
        profile=Profile.objects.filter(user=user)  # This line is fine!
        userfollowing=FollowingProfiles.objects.filter(Profile=profile)
        for following in userfollowing:
            username=following.ProfileName
            useraccount=User.objects.filter(username=username)
            # Use lowercase profile, not Profile
            # Profile=Profile.objects.filter(user=useraccount)  # This line was the problem!
            profile = Profile.objects.filter(user=useraccount)  # This line is the solution!
            Post = post.objects.filter(Profile=profile)  # Change to match new name
            ... rest of your code ...

您早先已经正确使用了小写的profile,而且似乎再也不需要了,所以我只是重复使用了这个名字。