【问题标题】:Django Pagination: local variable referenced before assignmentDjango Pagination:分配前引用的局部变量
【发布时间】:2015-05-21 21:14:48
【问题描述】:

我正在努力为我的 Django 应用程序提供分页功能。分页在我第一次加载应用程序时有效,但是当我从下拉菜单中获取每页值的新结果数量并在单击下一步按钮时更新页面时,我收到以下错误:

UnboundLocalError 在 /autotester/update_filters/
赋值前引用的局部变量“num_results”

以下是相关代码:

在views.py中:

def filter_report(request):

    # More code here with other irrelevant values

    if request.method == 'POST':
        num_results = request.POST.get('num_results_dropdown')

    tuple_table = tuple(table.items())    # table is a dictionary defined above
    paginator = Paginator(tuple_table, num_results)
    page_num = request.GET.get('page', 1)
    page = paginator.page(page_num)

在table.html中

<form id="filter_form" method="post" action="{% url 'update_filters' %}">
    <!-- My other filter fields -->
    <div class="label">Results</div>
    <select name="num_results_dropdown">
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="50">50</option>
        <option value="100">100</option>
        <option value="200">200</option>
        <option value="300">300</option>
    </select>
</form>
{% if page.has_previous %}
    <a href="?page={{ page.previous_page_number }}">prev</a>
{% endif %}

{{ page.number }} of {{ page.paginator.num_pages }}

{% if page.has_next %}
    <a href="?page={{ page.next_page_number }}">next</a>
{% endif %}

我的猜测是 num_results 不会被记住,因为当我尝试在 if 语句之外声明 num_results = total_testsuites 时,它会重置为 total_testsuites 并崩溃,因为不再有第 2 页。

【问题讨论】:

  • num_results 是 filter_report 中的局部变量,因此当请求不是 POST 请求时,不会实例化该变量。您是否尝试将其用作全局变量?
  • 在一个普通的 Python 脚本中,这正是我要做的,也许不是全局变量,但我会将它传递给 filter_report 函数。然而,Django 是不同的,我不完全确定我必须做什么。

标签: python django pagination


【解决方案1】:

不知何故,您的表单正在使用 GET 请求提交,这可能是由于一些奇怪的 Javascript 提交内容。 这得到以下事实的支持:如果您为num_results if 语句之前设置一个值,它将保持为该值。

无论哪种方式,您的代码都依赖于num_results,因此请更加明确,例如:

def filter_report(request):

    # More code here with other irrelevant values

    num_results = 10 # Set a sane default
    if request.method == 'POST':
        num_results = request.POST.get('num_results_dropdown')

    try:
        num_results = int(num_results) # A posted value will be a string
                                       # if its not a valid int this will throw an exception
        num_results = min(100,num_results) # Don't let it be too big
        num_results = max(1,num_results)   # Don't let it be too small either
    except:
        num_results = 10

    tuple_table = tuple(table.items())    # table is a dictionary defined above
    paginator = Paginator(tuple_table, num_results)

【讨论】:

  • 我现在不在工作,所以我无法尝试,但我会在明天早上第一时间尝试并通知您。但是,我想我已经尝试过类似的东西。我找不到任何对此的验证,但我很确定任何时候加载/重新加载页面时都会调用整个 views.py 文件并重置里面的先前值。
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多