עבודה עם AJAX לדפדוף בין רשומות

תגיות:

היי,

מנסה ליצור תיבת בחירה שמאפשרת להציג מידע על רשומה באמצעות AJAX.

סקריפט
<script>

 function showproj(str) {

   var xhttp;    

   if (str == "") {

     document.getElementById("txtHint").innerHTML = "";

     return;

   }

   xhttp = new XMLHttpRequest();

   xhttp.onreadystatechange = function() {

     if (this.readyState == 4 && this.status == 200) {

       document.getElementById("txtHint").innerHTML = this.responseText;

     }

   };

   xhttp.open("GET", "/projects", true);

   xhttp.send("filtered=" + document.getElementById('projects').value));

 }

</script>
פקד לבחירת רשומות
<form action=""> 

<select name="projects" onchange="showproj(this.value)">

<option value="">Select a project:</option>

{% for p in proj %}

  <option value="{{p['project_id']}}">{{p['project_name']}}</option>

{% endfor %}

</select>

</form>

<br>

</div>
טבלה שמציגה את הרשומות המסוננות
<div class="container" id="txtHint">

  <h2>Projects</h2>

  <p>List of all active projecct</p>

  

  <table class="table table-striped">

    <thead>

      <tr>

        <th>ID</th>

        <th>Project</th>

        <th>Budget</th>

        <th>Forcast</th>

        <th>End date</th>

        <th>Comments</th>

      </tr>

    </thead>

    <tbody>

        {% for p in proj_list %}

        <tr method="POST" action="/projects/">

          <td>

            <a href="/projects/{{p['project_id']}}">

              {{p['project_id']}}

            </a>

          </td>

          <td>{{p['project_name']}}</td>

          <td>{{p['budget']}}</td>

          <td>{{p['forcast']}}</td>

          <td>{{p['completion']}}</td>

          <td>{{p['comments']}}</td>

        </tr>

        {% endfor %}     

    </tbody>

  </table>

</div>
FLASK
@app.route('/projects/', methods=['GET', 'POST'])

def jsonproj():

    if request.method == 'POST':

        # filter_id = request.form['filtered']

        proj_list = [row for row in Projects.select().where(

            Projects.project_id == filter_id).dicts()]

        return jsonify(proj_list)

לצערי כל ניסיון לשנות יוצר לי באג במקום אחר.
אשמח מאוד לעזרה בשעות המעטות שעוד נותרו :slight_smile:

מה אתה מצפה שיקרה, ומה קורה בפועל? :slight_smile:
(וכדאי להוריד את ההערה מ־filter_id, ולדאוג להמיר אותו ל־int)

אני מצפה שהוא יציג רשומה בודדת מטבלת השקעות (flask אמור להחזיר מילון עם הרשומה הבודדת בכל פעם)
בפועל הוא קורס שלא ניתן לעבד את התשובה מהשרת

הסתכלת בלוג וראית למה השרת קורס? האם זה קורס גם לוקאלית?

שים לב שאתה שולח את הבקשה ב־GET, אבל מנסה לאחזר ב־flask את request.form, שזו שיטה לאחזר לערכי POST.
זאת ועוד – אתה שולח את הפרמטרים בצורה שאינה תואמת GET, אלא תואמת POST.

תבחר אחת מהשיטות – שתיהן נאות, אבל צריך להיות קונסיסטנטי גם בצד הלקוח וגם בצד השרת.

לייק 1

אחרי שינוי אני רואה שאני לא מצליח לשלוח לשרת את הערך של selection

סקריפט
<script type="text/javascript">
  function showproj(str) {
    var req = new XMLHttpRequest();
    var result = document.getElementById('result');
    req.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        result.innerHTML = this.responseText;
      }
    };
    req.open("GET", "/projects", true);
    req.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
    req.send("selection=" + document.getElementById('selection').value));
  }

בחרת ב־GET?
שינית ב־Flask את הקוד כך שיקח את המידע מ־GET ולא מ־POST?
עיין ב־send get with parameters xmlhttprequest

קוד עדכני של Flask עם מעקף כי כרגע לא מקבל ערך מהעמוד:

@app.route('/projects/', methods=['GET', 'POST'])
def jsonproj():
    if request.method == 'GET':
        selection = request.form.get('selection', 3)
        return_value = [
            row for row in Projects.select().where(
                Projects.project_id == selection).dicts()]
        return render_template('projects.j2', proj=return_value)

עדיין לא כ"כ הבנתי אם בחרת לשלוח את המידע בעזרת GET או POST.
אם בחרת בבקשת GET – אתה צריך לשנות פה לדעתי את request.form ל־request.args