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

时间:2019-08-06 09:31:04

标签: python html django

如何解决UnboundLocalError at /profile/ local variable 'context' referenced before assignment的问题。我觉得还好吗?当我删除Payment_method下拉菜单时,它可以工作,但是为什么不能与下拉菜单一起工作?

models.py

Paymet_choices = (
    ('easypaisa','EasyPaisa Number'),
    ('jazzcash', 'Jazzcash Number'),
)
class Profile(models.Model):
    payment_method = models.CharField(max_length=6, choices=Paymet_choices)

forms.py

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields  = ['image','Payment_method','Detail']

views.py

def profile(request):
    if request.method == 'POST': 
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

        context = {
            'u_form': u_form,
            'p_form': p_form
        }
    return render(request, 'users/profile.html', context)    

1 个答案:

答案 0 :(得分:0)

该错误表示您在分配变量之前正在使用context变量。

有两个问题。
首先,您的表格在此行上无效:
if u_form.is_valid() and p_form.is_valid():
因此,它将继续执行下一行(这意味着在外部else语句之外): return render(request, 'users/profile.html', context) 尚未分配context变量的值。

第二个问题,要解决该错误,请检查您的缩进。

        context = {
            'u_form': u_form,
            'p_form': p_form
        }
    return render(request, 'users/profile.html', context)

应该是

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'users/profile.html', context)

它将解决该错误,
现在回到第一个问题,您的表格无效。
在您使用form.errors看到错误之前,我们不知道为什么。
将此添加到users/profile.html模板中的任何位置以检查错误
{{ form.non_field_errors }}