Here's my template code for my comment queryset:
{% 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 %} I'm using django el pagination to implement ajax pagination. On the 3rd line you can see I initially load 10 comments. With this package, comes a {% show_more %} element I can add which, when clicked, will load the rest of the comments.
However, this {% show_more %}element disapears for some reason when I add {% include 'comment/comments.html' with comment_list=i.replies.all %}. For context, this include tag shows the replies for the current comment in the for loop.
Does anyone have any idea why this include tag affects the {% show_more %} element?
EDIT: Below is the relevent code for displaying show_more Github 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 {} Can I change something in the above code to possibly make it work, or atleast debug further to help me find more about the problem? Help appreciated.
3 Answers
Answers 1
You are probably consuming/changing variables in the included template that influence the behavior of show_more.
To debug you could either run via debugger and step into the show_more templatetag code or add print statements into that code (it's python so that works just fine).
The relevant code is in 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 will be empty if either:
pagehas reached the last iterationquerystringis empty (see the template django-el-pagination/el_pagination/templates/el_pagination/show_more.html)
Answers 2
Solved by adding an if statement for my include tag like this:
{% if i.replies.all %} {% include 'comment/comments.html' with comment_list=i.replies.all %} {% else %} which only adds the include tag if that comment has 1 or more replies. Previously it would add an empty queryset if there were no replies, causing errors in the code.
Answers 3
try changing the name here. comment_list to something else.
{% include 'comment/comments.html' with replies=i.replies.all %}
0 comments:
Post a Comment