分配之前引用的django局部变量't' [英] django local variable 't' referenced before assignment

查看:56
本文介绍了分配之前引用的django局部变量't'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到这是一个常见错误,我确实浏览了其他帖子,但是他们没有帮助我.

I saw this was a common error and I did look through other post, but they did not help me.

我遇到错误

Exception Value: local variable 't' referenced before assignment

但是在我的if验证中,我的t变量被声明不在上面三行.范围应该可以让我退货.

But my t variable is declared 3 lines above where it is saying it is not, inside my if validation. Scope should be fine for my return.

有问题的功能

def create(response):
        #response.user
        if response.method == "POST":
                form = CreateNewTrade(response.POST)
                if form.is_valid():
                        n = form.cleaned_data["name"]
                        t = AssetList(name=n)
                        t.save()
                        response.user.assetlist.add(t)

                return HttpResponseRedirect("/userdash/%i" %t.id) #we fail at this t variable

完整代码:

$ cat userdash/views.py

$ cat userdash/views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import AssetList, Items
from .forms import CreateNewTrade

# Create your views here.


#def index(response):
#       return HttpResponse("<h1>Hello Dark World!</h1>")

def userdash(response, id):
        ls = AssetList.objects.get(id=id)
        if response.method == "POST":
                print(response.POST)
                if response.POST.get("save"):
                        for item in ls.items_set.all():
                                if response.POST.get("c" + str(item.id)) == "clicked":
                                        item.sell_asset = True
                                else:
                                        item.sell_asset = False

                                item.save()

                elif response.POST.get("newItem"):
                        txt = response.POST.get("new")
                        if len(txt) > 2: #this validation is retarded and needs to be fixed
                                ls.items_set.create(user_asset=txt, sell_asset=False)
                        else:
                                print("invalid")


        #items = ls.items_set.get(id=1)
        #return HttpResponse("<h1>User Dashboard!</h1><h2>%s</h2><br></br><p>%s</p>" %(ls.name, str(items.user_asset)))
        return render(response, "userdash/list.html", {"ls":ls})

def home(response):
        #pass
        return render(response, "userdash/home.html", {})

def create(response):
        #response.user
        if response.method == "POST":
                form = CreateNewTrade(response.POST)
                if form.is_valid():
                        n = form.cleaned_data["name"]
                        t = AssetList(name=n)
                        t.save()
                        response.user.assetlist.add(t)

                return HttpResponseRedirect("/userdash/%i" %t.id)
        else:
                form = CreateNewTrade()
        return render(response, "userdash/create.html", {"form":form})

def view(response):
        return render(response, "userdash/view.html", {})

$ cat userdash/models.py

$ cat userdash/models.py

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class AssetList(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="assetlist", null=True)
        name = models.CharField(max_length=200)

        def __str__(self):
                return self.name

class Items(models.Model):
        assetlist = models.ForeignKey(AssetList, on_delete=models.CASCADE)
        user_asset = models.CharField(max_length=300)
        sell_asset = models.BooleanField()

        def __str__(self):
                return self.user_asset

$ cat userdash/templates/userdash/view.html

$ cat userdash/templates/userdash/view.html

{% extends 'userdash/base.html' %}

{% block title %} View page {% endblock %}
{% load crispy_forms_tags %}


{% block content %}
        {% for td in user.assetlist.all %}
                        <p><a href="/{{td.id}}">{{td.name}}</a></p>
        {% endfor %}

{% endblock %}

错误:

UnboundLocalError at /create/

local variable 't' referenced before assignment

Request Method:     POST
Request URL:    http://192.168.42.14:8081/create/
Django Version:     3.0.5
Exception Type:     UnboundLocalError
Exception Value:    

local variable 't' referenced before assignment

Exception Location:     ./userdash/views.py in create, line 51
Python Executable:  /usr/local/bin/uwsgi
Python Version:     3.7.3
Python Path:    

['.',
 '',
 '/home/piggy/Env/lib/python37.zip',
 '/home/piggy/Env/lib/python3.7',
 '/home/piggy/Env/lib/python3.7/lib-dynload',
 '/usr/lib/python3.7',
 '/home/piggy/Env/lib/python3.7/site-packages']

如何分配我的t变量,以便我的return语句接受它?

How do I assign my t variable so my return statement will accept it?

推荐答案

这是因为您的表格无效.因此,它将直接转到未定义 t 的返回 HttpResponseRedirect 部分.

It is because your form is not valid. So, it will directly go to the return HttpResponseRedirect part, where t is not defined.

def create(response):
        if response.method == "POST":
                form = CreateNewTrade(response.POST)

                # Because form.is_valid() failed, t will be undefined
                if form.is_valid():
                        n = form.cleaned_data["name"]

                        # Here only, you have assigned value of t
                        t = AssetList(name=n)
                        t.save()
                        response.user.assetlist.add(t)

                # Returns directly to this line, if you see indentation, t is not defined 
                return HttpResponseRedirect("/userdash/%i" %t.id)

请参阅上面的评论以了解发生了什么.因此,可能的错误减少器可能是:

See comments above to understand what's going on. So, possible error reducer could be:

# Define t globaly inside create() method
def create(response):
        t = None
        if response.method == "POST":

现在,您已经在函数内部全局定义了 t = None ,它不会显示以前显示的错误.但是,仍然会有问题,因为 t None .因此,它没有任何属性 id .因此,没有属性DosNotExist .因此,您必须考虑到表单无效时该怎么办,在哪里重定向.

Now, you have defined t=None globally inside function, it will not show the error it was showing before. But, there will still be problem because t is None. So, it won't have any attribute id. Hence, has no attribute DoesNotExist will be shown. Therefore, you have to think that what to do if form is not valid, where to redirect.

或者,如果表单无效,则可以使用else语句处理该问题.喜欢:

Or, you can deal with the problem with else statement if form is not valid. Like:

def create(response):
        if response.method == "POST":
                form = CreateNewTrade(response.POST)

                # Because form.is_valid() failed, t will be undefined
                if form.is_valid():
                        n = form.cleaned_data["name"]

                        # Here only, you have assigned value of t
                        t = AssetList(name=n)
                        t.save()
                        response.user.assetlist.add(t)

                        return HttpResponseRedirect("/userdash/%i" %t.id)

        # When if statements doesnot apply, always come to this line unless it goes inside form.is_valid()
        return HttpResponseRedirect("/userdash/")   # redirect to the page whose arguments doesnot depend upon the form subbmission

现在,希望您能理解问题所在.

Now, I hope you understood what was the problem.

这篇关于分配之前引用的django局部变量't'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆