Can’t loop value in html table

Question:

I’m building a function which can let admin to delete account in that page.

I have several accounts in admin page but all the delete buttons are holding a value from first account in that page instead of other account.

<form action="/admin" method="post">
<table class="table">
    <thead class="table-dark">
        <tr>
            <th>Users</th>
        </tr>
    </thead>
    {% for user in users %}
    <tr style="background-color:burlywood"> 
        <td><input type="hidden" name="user" value="{{user.username}}">{{user.username}}</td>
        <td><input type="submit" for="user" value="Delete"></td>
    {% endfor %}  
    </tr>   
       
</table>
@app.route("/admin", methods=["GET", "POST"])
@login_required
def admin():
"""Manage account"""
if request.method == "GET":
    user_id = session["user_id"] 
    admin = db.execute("SELECT id FROM users WHERE id = (?)", 
user_id)

    for row in admin:
        if int(row["id"]) == 17:
            users = db.execute("SELECT username FROM users")
            return render_template("admin.html", users = users)

        else:    
            return apology("Only Admin can access this page!")
    return apology("valid return")

else:
    username = request.form.get("user")
    flash(f"{username} has been deleted!")
    return redirect("/")

I expected each delete button is holding each value in column.

After the issue is fixed, when delete button is clicked flash function will show the different username based on the value not admin at all.

here is html page

Asked By: Darren Wong

||

Answers:

I think your line only returns usernames in your users variable:
users = db.execute("SELECT username FROM users")

So users in your template is an array that only contains a list of names, or only contains one name.

1 / Whats contains users?

2 / what if you put {{ user }} instead of {{ user.username }} in your template?

Answered By: Yellow-bob

From the tags I believe you’re using Jinja to load and render the html page, however, you should be more clear about what you want to ask.
This may sound like a bad idea and definitely something you shouldn’t do in production but how about creating different forms for each user?
Something like this :

<table class="table">
    <thead class="table-dark">
        <tr>
            <th>Users</th>
        </tr>
    </thead>
    {% for user in users %}
    <form action="/admin" method="post">
        <tr style="background-color:burlywood"> 
             <td><input type="hidden" name="user" value="{{user.username}}">{{user.username}}</td>
             <td><input type="submit" for="user" value="Delete"></td>
        </tr>
    </form>   
    {% endfor %}   
</table>
Answered By: Akarsh Tripathi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.