2016-07-25 18 views
0

Basierend auf Flask und SQLAlchemy funktioniert Paginierung nur auf Standard 1. Seite, wenn Klick Pre oder nächste Seite, zeigt eine leere Seite (mit dem leeren SearchForm). Es scheint, dass vor und nächste Seite kann nicht Suche "Schlüsselwort" Wert erhalten, Seitenumbruch gibt keine Ergebnisse zurück. Ich habe versucht, wie folgt:Flask Paginierung kann keine Formulardaten auf der nächsten Seite erhalten, wie folgt:

form.py

class SearchForm(Form): 
    search_keyword = StringField('', validators = [DataRequired()]) 
    submit = SubmitField('Start Search') 

views.py

@app.route('/search', methods=['GET']) 
def search(): 
    form = SearchForm(): 
    keyword = form.search_keyword.data 

    page = request.args.get('page', 1, type=int) 
    value = request.args.get('keyword') 

    if form.validate_on_submit(): 
     pagination = Post.query.filter(Post.content.like(keyword))paginate(
      page, per_page=current_app.config['default'], error_out=False) 

posts = pagination.items 
return render_template('search.html', posts=posts, pagination=pagination, form=form, value=value) 

search.html

<div class="list"> 
    {% include 'base.html' %} 
</div> 
{% if pagination %} 
    <div class="pagination"> 
    {{ macros.pagination_widget(pagination, '.search', value=value)}} 
    </div> 
{% endif %} 
+0

Sie werden den Code für die Paginierung enthalten müssen Widget- Es ist wahrscheinlich, Ihre Paginierung Das Widget fügt die benötigten URL-Argumente nicht an. – Doobeh

+0

Ich hatte 'base.html' für diese Suchpaginierung eingefügt, aber ich bin nicht sicher, ob das Schlüsselwort 'value' 'base.html' durchlaufen muss. Die 'base.html' ist nur eine Iterationsseite (für Post in Posts, Listenpost ...). Wie kann ich prüfen, ob der 'Wert' erfolgreich in die Query übernommen wurde? – rogwan

Antwort

0

Ich weiß nicht, wie viel ähnlich Ihr Fall zu meinem, , aber was ich sicher bin, ist, dass Sie

umgehen müssen
if form.validate_on_submit(): 

durch eine Ausnahme in meinem Fall fügt hinzu:

if form.validate_on_submit() or request.args.get('page'): 

aber mein Problem nicht einfach durch diesen Schritt allein gelöst war, hatte ich meine Daten in eine globale Liste zu speichern und wieder abzurufen. Aber Wohlgemerkt, ich bin mit einem POST Form GET nicht

if request.args.get("page"): 
    global pll 
    ll = pll 
else: 
    ll = [form.number.data, form.datetime.data, form.tl.data] 
    global pll 
    pll = ll 

und hier ist meine ganze schreckliche Abhilfe:

@app.route('/search', methods=['GET', 'POST']) 
def search(): 
    form = Search_s() 
    if form.validate_on_submit() or request.args.get("page"): 
     from sqlalchemy.sql import and_ 
     terms = [] 
     counter = 0 
     if request.args.get("page"): 
      global pll 
      ll = pll 
     else: 
      ll = [form.number.data, form.datetime.data, form.tl.data] 
      global pll 
      pll = ll 
     for l in ll: 
      counter += 1 
      if l is not None: 
       if counter == 1: 
        if len(l) >= 2: 
         terms.append("number="+str(ll[0])) 
       elif counter == 2: 
        if len(l) >= 2: 
         terms.append("timestamp='"+ll[1]+"'") 
       elif counter == 3: 
        if l != 0: 
         terms.append("office_id="+str(ll[2])) 
     if len(terms) == 0: 
      flash("Error: fault in searching parameters ..", "danger") 
      return redirect(url_for("search")) 
     serials = Serial.query.filter(and_(*terms)) 
     if serials.first() is None: 
      flash("Notice: Sorry no results were found ..", "info") 
      return redirect(url_for("search")) 
     page = request.args.get('page', 1, type=int) 
     pagination = Serial.query.filter(and_(*terms)).order_by(Serial 
                   .timestamp 
                   .desc()).paginate(
                    page, 
                    per_page=10, 
                    error_out=False) 
     serialsp = pagination.items 
     return render_template("search_r.html", 
           serials=serials, 
           ptitle="Tickets search", 
           offices=Office.query, 
           tasks=Task.query, 
           pagination=pagination, 
           serialsp=serialsp, 
           len=len, 
           snb="#snb1", 
           snb2="#da1") 
    return render_template("search.html", 
          form=form, 
          ptitle="Tickets search", 
          offices=Office.query, 
          tasks=Task.query, 
          snb="#snb1", 
          snb2="#da1")