2014-10-07 5 views
0

Я пытаюсь распечатать список вложенных комментариев, используя цикл рекурсивного цикла Jinja2. Проблема заключается в том, что после распечатки полной вложенной ветви она начинается снова с одного из вложенных дочерних элементов и рисует другой список.Итерация через список Python Flask/Jinja2 смежности

Я хотел бы найти способ пропустить итерацию, если она уже была напечатана раньше.

У меня есть следующие модели Колба определены:

class Comment(db.Model): 
    """Class containing comments to a post""" 

    __tablename__ = "comment" 

    id = db.Column(db.Integer, primary_key=True) 
    body = db.Column(db.String(255)) 

    parent_id = db.Column(db.Integer, db.ForeignKey('comment.id')) 
    children = db.relationship("Comment") 

    def __init__(self, body=None, parent_id=None): 
     self.body = body 
     self.parent_id = parent_id 

Это загружает несколько вложенных комментариев:

comment = Comment(body="First Comment") 
db.session.add(comment) 
db.session.commit() 

comment2 = Comment(body="Nested with First Comment", parent_id=comment.id) 

db.session.add(comment2) 
db.session.commit() 

comment3 = Comment(body="Also nested with First Comment", parent_id=comment.id) 
comment4 = Comment(body="Nested with the fist nested comment", parent_id=comment2.id) 

db.session.add(comment3) 
db.session.add(comment4) 
db.session.commit() 

Вот соответствующий шаблон Jinja2:

<div class="row"> 
    <ul class="media-list"> 
    <li class="media"> 
     {%- for comment in user.musician.comments recursive %} 
     <div class="media"> 
     <span class="pull-left"> 
          {{ comment.author.name }} said: 
         </span> 
     <div class="media-body"> 
      <p>{{comment.body }}</p> 
      {% if comment.children %} 
      <!-- Children starts here --> 
      {{ loop(comment.children) }} 
      <!-- end of child --> 
      {% endif %} 
     </div> 
     </div> 
     {% endfor %} 
    </li> 
    </ul> 
</div> 

ответ

0

Это звучит как ваш первоначальный запрос выглядит примерно так:

comments = Comment.query.all() # perhaps there's an order_by 

Это возвращает запрос, содержащий все комментарии в нем, даже те, которые являются дочерними. То, что вы действительно хотите, это только те комментарии, которые не являются детьми других комментариев.

comments = Comment.query.filter(Comment.parent_id == None) # same order_by goes here 
+0

Спасибо @dirn, что сделал трюк! – thiezn

Смежные вопросы