2017-12-06 1 views
1

Ich baue eine Seite mit Seitenumbruch und einem Filterformular (2 GET-Anfragen). Wenn die URL sowohl Seitenumbruch- als auch Filterergebnisse enthält, etwa /questions/?page=2&all_questions=on, funktioniert es einwandfrei. Es funktioniert auch, wenn es nur Filterergebnisse hat, etwa /questions/?all_questions=on.Django - Paginieren mit einer anderen GET-Anfrage; funktioniert nicht mit nur Seitenzahl Seitennummer

Wenn jedoch nur das Seitennummerierungsseitenergebnis angezeigt wird, etwa /questions/?page=1, werden keine Ergebnisse angezeigt.

So dachte ich, ich muss etwas mit den Ansichten tun, so dass, wenn es nur eine Seitenzahl in der URL gibt, ein Standardfilter gegeben wird. Ich weiß, dass ich wahrscheinlich etwas zum Try-and-Exception-Teil der Paginierung hinzufügen muss, aber ich bin über den eigentlichen Code, den ich schreiben muss, ziemlich ratlos.

def questions_index(request): 

    user = request.user 
    form = QuestionFilterForm(request.GET or None) 
    question_list = [] 
    if not form.is_bound: 
     question_list = Question.objects.all().order_by('-date_created') 
    if form.is_valid(): 
     if form.cleaned_data['all_questions'] | (form.cleaned_data['general_questions'] & form.cleaned_data['location_all_gta']) == True: 
      question_list = Question.objects.all().order_by('-date_created') 
     elif form.cleaned_data['location_all_gta'] == True: 
      question_list += Question.objects.filter(question_type=1).order_by('-date_created') 
     else: 
      if form.cleaned_data['general_questions'] == True: 
       question_list += Question.objects.filter(question_type=2).order_by('-date_created') 
      if form.cleaned_data['location_toronto'] == True: 
       question_list += Question.objects.filter(location='1').order_by('-date_created') 

    paginator = Paginator(question_list, 15) 

    # Pagination 
    page = request.GET.get('page') 
    try: 
     questions = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     questions = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     questions = paginator.page(paginator.num_pages) 

    ### I need to write something here... 
    except (url has no filter result) 
     give default filter 

    return render(request, 'questions_index.html', {'questions': questions, 'user': user, 'form': form}) 
+1

Haben Sie versucht: question_list = Question.objects.all() order_by ('- DATE_CREATED') paginator = Paginator (question_list, 15.) questions = paginator.page (Seite) –

Antwort

4

Ihr Problem ist am Anfang, nicht am Ende. Wenn Sie schreiben:

if not form.is_bound: 
    question_list = Question.objects.all().order_by('-date_created') 

wird diese Bedingung nur erfüllt werden, wenn request.GET leer. Die Methode is_bound gibt True zurück, wenn Sie ihr Daten geben, unabhängig davon, ob die Schlüssel des Wörterbuchs Formularfelder sind (docs). In dem von Ihnen beschriebenen Fall enthält request.GET nur den Schlüssel page.

Eine mögliche Lösung ist es, diesen Teil neu zu schreiben wie:

if not form.is_bound or (len(request.GET) == 1 and 'page' in request.GET): 
    question_list = Question.objects.all().order_by('-date_created') 
+0

Vielen Dank. Das war's. Ich werde Kopfgeld geben, wenn das Zeitlimit abgelaufen ist – Valachio

Verwandte Themen