2016-08-01 15 views
0

Ich habe derzeit ein Problem, die Seitenumbruch-Funktion in mein Projekt aufzunehmen. Ich weiß, es gibt LIMIT/OFFSET oder yield_per(), aber ich konnte sie nicht implementieren.Python Flask SQLAlchemy-Paginator Zugriff nächste Seite in HTML-Ansicht

Ich benutze SQLAlchemy nicht Flask-SQLAlchemy so paginate wird nicht funktionieren.

Meine Datenbank ist nicht so groß. Ich versuche, Räume anzuzeigen, die von einem Benutzer hinzugefügt wurden. Alles in allem wird ein Benutzer 20 ~ Räume haben, große Benutzer vielleicht 100. Ich möchte auf der Profilseite die 6 zuletzt eingefügten Räume zeigen und wenn es mehr gibt, sollte es Paginierung geben, wie Seite 2 die nächsten 6 zeigt usw.

Ich verwende SQLAlchemy-Paginator.

Ich habe es bereits implementiert und getestet, es funktioniert gut. Es begrenzt auch schon die Ergebnisse abhängig davon, welche Seite ich bin. Aber wie greife ich während HTML auf die nächste Seite zu? Hier

ist der Python-Code:

@app.route("/user/logged_in") 
@login_required 
@check_confirmed 
def logged_in(): 
    if current_user.email_verified: 
     users_room = db_session.query(Zimmer).filter_by(users_id=current_user.id).order_by(desc("id")) 
     paginator = Paginator(users_room, 2) 
     for page in paginator: 
      print "page number of current page in iterator", page.number 
      print "this is a list that contains the records of current page", page.object_list  
     return render_template('logged_in.html', paginator=paginator) 
    return redirect(url_for('unconfirmed')) 

Hier ist die Aussicht. Die Lösung muss irgendwo da sein. Ich kann auf Seiten von page.previous_page_number oder page.next_page_number zugreifen. Aber es gibt kein Beispiel in der Doku wie man es im Auge behält.

<div class="user-rooms"> 
<h2> Ihre Zimmer </h2> 
{% for page in paginator %} 
{% if page.number == 1 % } 
{% for zimmer in page.object_list %} 
{% if zimmer.users_id == current_user.id %} 
<div class="col-sm-4 col-xs-6 col-xxs-12 img-holder"> 
<img src="../static/userimg/{{ zimmer.hauptbild }}"/> 
<div class="buttons-del-work"> <a href="{{ url_for('edit_room', the_room_id=zimmer.id) }}" class="btn mybtn-work"> Bearbeiten </a> <a href="{{ url_for('delete_room', the_room_id=zimmer.id) }}" class="btn mybtn-del"> Löschen </a> </div> 
</div> 
{% endif %} 
{% endfor %} 
{% endif %} 
{% endfor %} 

Wenn ich manuell die Zahlen Seite ändern sie mir die richtigen Elemente zeigen, so fühle ich mich wie ich in der Nähe bin:

{% if page.number == 1 % } 

Antwort

0

Okay, hier ist eine Lösung (die keine weiteren Verfahren nicht verwendet aus dem SQLAlchemy-Paginator-Paket). Ich codierte alles selbst, aber ich würde noch gerne wissen, wie es mit page.next_page_number usw.

Erklärung getan wird:

Als erstes habe ich hinzugefügt ein Argument (pagenumber) meine logged_in Funktion. Jedes Mal, wenn url_for("logged_in", pagenumber=1) aufgerufen wird, muss die Seitennummer auf den Standardwert 1 eingestellt werden.

Ich habe eine leere Liste, wo ich alle page.number Elemente hinzufügen, damit ich weiß, wie viele Seiten meiner resultset haben:

pages_list = [] 
    for page in paginator: 
     pages_list.append(page.number) 

ich die pages_list in der Ansicht können die Tasten zu erzeugen, die Verwendung auch angeklickt wird, um die nächste Seite zu sehen, gebe ich auch die pagenumber Blick auf die html:

return render_template('logged_in.html', paginator=paginator, pagenumber=pagenumber, pages_list=pages_list) 

Hier ist die HTML-Ansicht, wo ich nur die Schaltflächen anzuzeigen:

<div class="col-xs-12"> 
{% for number in pages_list %} 
<a href="{{ url_for('logged_in', pagenumber = number) }}"> {{ number }} </a> 
{% endfor %} 
</div> 

Nun, wenn ein Benutzer auf eine der Schaltflächen klickt der logged_in wird mit einem neuen Seitennummer Argument (die tatsächliche pagesite Sie geklickt haben)

Im logged_in genannt werden ich auch Seitennummer vor int typecasted hinzugefügt, um es zu html geben Ausblick:

pagenumber = int(pagenumber) 

Lösungscode

Python:

def logged_in(pagenumber): 
if current_user.email_verified: 

    users_room = db_session.query(Zimmer).filter_by(users_id=current_user.id).order_by(desc("id")) 

    paginator = Paginator(users_room, 2) 
    pages_list = [] 
    for page in paginator: 
     pages_list.append(page.number) 

    pagenumber = int(pagenumber) 

    return render_template('logged_in.html', paginator=paginator, pagenumber=pagenumber, pages_list=pages_list) 
return redirect(url_for('unconfirmed')) 

HTML:

<div class="user-rooms"> 
<h2> Ihre Zimmer </h2> 
{% for page in paginator %} 
{% if page.number == pagenumber %} 
{% for zimmer in page.object_list %} 
<div class="col-sm-4 col-xs-6 col-xxs-12 img-holder"> 
<img src="../static/userimg/{{ zimmer.hauptbild }}"/> 
<div class="buttons-del-work"> <a href="{{ url_for('edit_room', the_room_id=zimmer.id) }}" class="btn mybtn-work"> Bearbeiten </a> <a href="{{ url_for('delete_room', the_room_id=zimmer.id) }}" class="btn mybtn-del"> Löschen </a> </div> 
</div> 
{% endfor %} 
{% endif %} 
{% endfor %} 
</div> 

<div class="col-xs-12"> 
{% for number in pages_list %} 
<a href="{{ url_for('logged_in', pagenumber = number) }}"> {{ number }} </a> 
{% endfor %} 
</div>