2017-10-20 4 views
6

Voici mon code de modèle pour mon commentaire queryset:élément disparaît quand j'ajoute un {%}% incluent balise dans ma boucle

{% block comments %} 
{% load el_pagination_tags %} 
    {% paginate 10 comment_list %} 
     {% for i in comment_list %} 
      <div class='comment_div'> 
       <div class="left_comment_div"> 
        <p>{{ i.comment_text }}</p> 
       </div> 
      </div> 
      {% include 'comment/comments.html' with comment_list=i.replies.all %} 
     </div> 
     {% endfor %} 
    {% show_more %} 
{% endblock %} 

J'utilise django el pagination pour mettre en œuvre ajax pagination. Sur la troisième ligne, vous pouvez voir que je charge d'abord 10 commentaires. Avec ce paquet, vient un {% show_more %}element I can add qui, lorsqu'il est cliqué, chargera le reste des commentaires.

Cependant, cet élément {% show_more %} disparaît pour une raison quelconque lorsque j'ajoute {% include 'comment/comments.html' with comment_list=i.replies.all %}. Pour contexte, cette balise include affiche les réponses pour le commentaire actuel dans la boucle for.

Quelqu'un at-il une idée de la raison pour laquelle cette balise d'inclusion affecte l'élément {% show_more %}?

EDIT: est sous le code relevent pour afficher show_moreGithub Source

el_pagination_tags.py

# show the template only if there is a next page 
if page.has_next(): 
    print('Has next') #doesn't print 
    request = context['request'] 
    page_number = page.next_page_number() 
    # Generate the querystring. 
    querystring_key = data['querystring_key'] 
    querystring = utils.get_querystring_for_page(
     request, page_number, querystring_key, 
     default_number=data['default_number']) 
    return { 
     'label': label, 
     'loading': loading, 
     'class_name': class_name, 
     'path': iri_to_uri(data['override_path'] or request.path), 
     'querystring': querystring, 
     'querystring_key': querystring_key, 
     'request': request, 
    } 
# No next page, nothing to see. 
print('No next') #prints for every comment (e.g. 20 times when 20 comments) 
return {} 

Puis-je changer quelque chose dans le code ci-dessus pour faire éventuellement fonctionner, ou atleast debug plus loin pour m'aider à en savoir plus sur le problème? Aide appréciée.

+0

Est-il présent lorsque vous inspectez la page? –

+0

Non ce n'est pas là quand j'inspecte – Zorgan

+1

Pourrait aussi aider à coller le contenu de 'comment/comments.html'. Il n'y a pas d'erreur dans la console Python? – Risadinha

Répondre

2

résolu en ajoutant une déclaration if pour mon tag include comme ceci:

 {% if i.replies.all %} 
      {% include 'comment/comments.html' with comment_list=i.replies.all %} 
     {% else %} 

qui ne fait qu'ajouter à la balise include si ce commentaire a 1 ou plusieurs réponses. Auparavant, il ajoutait un jeu de requête vide s'il n'y avait pas de réponses, provoquant des erreurs dans le code.

1

Essayez de changer le nom ici. comment_list à autre chose.

{% include 'comment/comments.html' with replies=i.replies.all %} 
+0

Ne fonctionne pas (donne cette erreur: 'RecursionError: profondeur de récursivité maximale dépassée lors de l'appel d'un objet Python ') – Zorgan

+0

Cela peut provenir d'un endroit différent. Pouvez-vous mettre à jour votre question avec le code comments.html et la traceback d'erreur? –

2

Vous êtes probablement consommer/modification des variables du modèle inclus qui influent sur le comportement des show_more. Pour déboguer, vous pouvez soit exécuter via le débogueur et entrer dans le code show_more templatetag, soit ajouter des instructions d'impression dans ce code (c'est python, donc ça marche très bien).

Le code correspondant est en django-el-pagination/el_pagination/templatetags/el_pagination_tags.py # 330 (https://github.com/shtalinberg/django-el-pagination):

# This template tag could raise a PaginationError: you have to call 
# *paginate* or *lazy_paginate* before including the showmore template. 
data = utils.get_data_from_context(context) 
page = data['page'] 
# show the template only if there is a next page 
if page.has_next(): 
    request = context['request'] 
    page_number = page.next_page_number() 
    # Generate the querystring. 
    querystring_key = data['querystring_key'] 
    querystring = utils.get_querystring_for_page(
     request, page_number, querystring_key, 
     default_number=data['default_number']) 
    return { 
     'label': label, 
     'loading': loading, 
     'class_name': class_name, 
     'path': iri_to_uri(data['override_path'] or request.path), 
     'querystring': querystring, 
     'querystring_key': querystring_key, 
     'request': request, 
    } 
# No next page, nothing to see. 
return {} 

show_more sera vide si:

  • page a atteint la dernière itération
  • querystring est vide (voir le modèle django-el-pagination/el_pagination/templates/el_pagination/show_more.html)
+0

Pouvez-vous donner des suggestions que je peux essayer pour le débogage? Soit modifier la fonction 'show_more()' ou ajouter des instructions print? J'ai édité mon code si vous voulez jeter un coup d'œil - je ne sais pas pourquoi 'Has next' ne s'imprime même pas une seule fois, même si tous les commentaires sont toujours chargés. Une idée? – Zorgan

+0

Si elle n'atteint pas cette impression mais atteint le 'si' alors' page' est 'None' ou' page.has_next() 'est' False'. Peut-être que la page est en quelque sorte perdue du contexte ou remplacée par 'None' à un moment donné. Comparez le contexte (via 'debug' dans le template) entre la version de travail et la version non-working. – Risadinha