UnboundLocalError в / local переменная 'Profile', на которую ссылаются до назначения - PullRequest
0 голосов
/ 27 декабря 2018

Я пишу представления 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 %}

, а ошибка: -

, поэтому ошибка в 3-й строке обзора

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

1 Ответ

0 голосов
/ 27 декабря 2018

Я предполагаю, что вы уже импортировали модуль Profilefrom .models import Profile или подобным) и не понимаете, почему он не существует (если у вас его нет, вам нужно добавить этот импорт вначало вашего файла).

Даже если вы импортировали его, этот код не будет работать.Ваша проблема в том, что вы присваиваете имя Profile в области действия функции, что делает его локальной переменной, а локальные переменные являются локальными (но изначально пустыми) от начала функции.Попытка получить к ним доступ до того, как они будут назначены, поднимает UnboundLocalError, который вы видите (эта ошибка только возникает, когда вы пытаетесь читать с локального имени перед тем, как оно назначено;не может быть вызван просто невозможностью импортировать модуль, который просто вызовет NameError).Вы не могли видеть глобально импортированный 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 в нижнем регистре и больше никогда не нуждались в этом, поэтомуЯ только что использовал это имя.

...