2015-05-21 4 views
1

Я работаю над тем, чтобы разбивать страницы на мое приложение Django. Пагинация работает, когда я сначала загрузить приложение, однако, когда я хватаю новое число результатов на стоимости страницы из выпадающего меню и обновите страницу в любое время я нажимаю на кнопку Далее, я получаю следующее сообщение об ошибке:Django Pagination: локальная переменная, на которую ссылаются перед назначением

UnboundLocalError at /autotester/update_filters/
local variable 'num_results' referenced before assignment

Вот соответствующий код:

в 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 не помнится, потому что, когда я пытался объявить num_results = total_testsuites за пределами инструкции if, он возвращается к total_testsuites и падает, потому что нет страницы 2.

+0

num_results является локальной переменной в filter_report так, если запрос не запрос POST, переменная не инстанцирован , Вы пытаетесь использовать его как глобальную переменную? –

+0

В обычном сценарии Python, что я и делал, возможно, это не глобальная переменная, но я бы передал ее функции 'filter_report'. Тем не менее, Django отличается, и я не совсем уверен, что мне нужно делать. – steveclark

ответ

0

Как-то ваша форма отправляется с использованием запроса 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) 
+0

Я сейчас не работаю, поэтому я не могу попробовать, но завтра я попробую это первым делом и дам вам знать. Однако, я думаю, я уже пробовал что-то подобное. Я не могу найти никакой проверки этого, но я уверен, что в любое время, когда страница загружается/перезагружается, когда вызывается весь файл 'views.py', а предыдущие значения сбрасываются. – steveclark

+0

Я просто попробовал это, и он не работает – steveclark

Смежные вопросы