Django分页:在赋值前引用的局部变量



我正在为我的Django应用程序获得分页工作。当我第一次加载应用程序时,分页工作,但是当我从下拉菜单中获取每个页面值的新结果数量并在单击下一个按钮时更新页面时,我得到以下错误:

UnboundLocalError at/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页。

不知何故,您的表单正在使用GET请求提交,这可能是由于一些奇怪的Javascript提交的东西。如果您在 if语句之前为num_results 设置了一个值,那么它将保持该值。

无论哪种方式,您的代码都依赖于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)

相关内容

最新更新