【问题标题】:reason behind "local variable 'variable ' referenced before assignmen" ERROR“分配前引用的局部变量'变量'”错误背后的原因
【发布时间】:2019-01-29 09:49:33
【问题描述】:

我对 django 不太熟悉。正在做一个学习项目。所以在这里我得到了错误,上面写着 UnboundLocalError, "local variable 'url_array' referenced before assignment" 。这是我的 form.py 、 views.py 和 html 代码。请看看并给我一个解决方案。

forms.py

from django import forms
from .models import Images

class ImageForm(forms.ModelForm):
    class Meta:
        model = Images
        fields = ('__all__')

views.py

class Upload(View):

    def post(self, request):

        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            imageZip=request.FILES
            fs = FileSystemStorage()
            url_array = []


            with ZipFile(imageZip['image'], 'r') as zip:
                zip.extractall()
                unzip_file= zip.namelist()
                for files in unzip_file:
                    with open(files, "rb") as file:
                        name = fs.save('read.jpg', file)
                    url_array.append(fs.url(name))
        else:
            form = ImageForm()


        return render(request, 'toDo_app.html', context = {'form': form, 'url':url_array})

toDo_app.html

<form  class="" enctype="multipart/form-data" action="/upload/" method="post">
          {% csrf_token %}
          {{ form.as_p }}
          <button type="submit" >Upload</button>


       </form>

          <br>

          {% if url %}
            <p>Uploaded file: </p>
            <ul>
              {% for urls in url %}
                <li>  <a href="{{ urls }}">{{ urls }}</a> </li>
                {% endfor %}

            </ul>



          {% endif %}

所以我的错误是在return render(request, 'toDo_app.html', context = {'form': form, 'url':url_array}) 行。 感谢您的宝贵时间,我将非常感谢您的解释和解决方案

【问题讨论】:

  • 你在使用 url_array 时没有分配任何东西。你只在你的条件块内赋值,所以如果条件评估为假,你使用的是未定义的符号。

标签: python django


【解决方案1】:

变量url_array 在if 语句的一个主体中初始化。 if 语句有可能永远不会被评估为 True,因此 url_array 将在您的函数返回时未初始化。该函数将无法返回render(...),因为url_array 没有值。

只需确保 url_array 使用 if 语句之外的某个默认值进行初始化,与 return 语句在同一范围内。

【讨论】:

  • 非常感谢您的帮助..是的,我并没有真正注意到我必须将其设为全局变量。谢谢
【解决方案2】:

在 if 块之前分配一个 url_array

def post(self, request):
           url_array = []
           form = ImageForm(request.POST, request.FILES)

【讨论】:

  • 非常感谢您的帮助。我希望我可以一次勾选两个答案。我已经投票了
猜你喜欢
  • 2018-07-16
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多