2016-12-05 3 views
1

Ich habe einen Blog mit Python, Google App Engine und Jinja2 erstellt. Ich habe eine Entität, die angibt, wer einen Beitrag gemocht hat, mit Ausnahme des Postautors. Ich wiederhole alle Benutzer, die einen Beitrag gemocht haben, und vergleiche ihn so, dass der Benutzer, der den Beitrag erstellt hat, seinen eigenen Beitrag nicht mögen kann. Ich habe auch einen unähnlichen Knopf, der nur erscheinen sollte, wenn jemand einen Beitrag gemocht hat. Ich bin in der Lage, die Post zu mögen und nicht zu mögen; Ein Benutzer mag einen Beitrag und die Schaltfläche "unähnlich" wird angezeigt. Das Problem besteht darin, dass die Schaltfläche "Gefällt mir" nicht entfernt wird und neben der Schaltfläche "Ungleich" angezeigt wird. Dies führt dazu, dass ein Nutzer den gleichen Beitrag mehrmals mag Benutzer hat auf die Schaltfläche "Gefällt mir" geklickt. Die Variable username wird der aktuell angemeldete BenutzerJinja2 Bedingungen nicht richtig funktioniert beim Iterieren

{% for like in likes %} 
    {% if post.username != username and like.username != username %} 
    <li> 
     <form method="POST" id="likeForm"> 
      <input type="hidden" name="likePost" value="{{post.key().id()}}"> 
      <button type="submit" class="btn btn-outline-success btn-sm" form="likeForm">Like</button> 
     </form> 
    </li> 
    {% endif %} 
    {% if post.username != username and like.username == username %} 
    <li> 
     <form method="POST" id="unlikeForm"> 
      <input type="hidden" name="unlikePost" value="{{like.key().id()}}"> 
      <button type="submit" class="btn btn-outline-danger btn-sm" form="unlikeForm">Unlike</button> 
     </form> 
    </li> 
    {% endif %} 
{% endfor %} 

Antwort

2

Sie sind falsch interpretiert das Verhalten des Codes. Die Bedingung für die Anzeige der Like Taste ist:

{% if post.username != username and like.username != username %} 

Was bedeutet, dass eine Like Taste für jeden in der als von Nutzern anderen erzeugt likes Liste like angezeigt wird username, unabhängig von der Tatsache, dass username den Beitrag gefallen hat oder nicht. Wahrscheinlich nicht, wonach Sie suchen. Sie sollten das Like nicht anzeigen, während es auf iteriert, Sie sollten es nur einmal anzeigen, wenn Sie nach dem Durchlaufen aller likes keine von username produzierten finden.

Was die mehrere Unlike Tasten - Ich vermute, Sie überprüfen nicht für eine bereits bestehende like von username auf einem Pfosten, wenn die Like Taste gedrückt wird, damit mehrere solche like Instanzen in der likes Liste ermöglicht - jeder von ihnen wird Ursache eine Unlike Schaltfläche wird angezeigt.

ich nur die Logik in Python (einfacher als in jinja2, wahrscheinlich auch schneller) ausführen würde:

if post.username != username: 
    post.liked = False 
    for like in likes: 
     if like.username == username: 
      post.liked = True 
      break 

und in jinja2:

{% if post.username != username %} 
    {% if post.liked %} 
     <li> 
      <form method="POST" id="unlikeForm"> 
       <input type="hidden" name="unlikePost" value="{{like.key().id()}}"> 
       <button type="submit" class="btn btn-outline-danger btn-sm" form="unlikeForm">Unlike</button> 
      </form> 
     </li> 
    {% else %} 
     <li> 
      <form method="POST" id="likeForm"> 
       <input type="hidden" name="likePost" value="{{post.key().id()}}"> 
       <button type="submit" class="btn btn-outline-success btn-sm" form="likeForm">Like</button> 
      </form> 
     </li> 
    {% endif %} 
{% endif %} 

Hinweis: Code-Schnipsel nicht wirklich getestet ...

+0

Danke. Es hat mir wirklich geholfen, das Problem zu lösen. –

Verwandte Themen