user3043594
user3043594

Reputation: 166

How do I code a count for double nested for loop?

I'm trying to pass just the piece number to my html. This will be used to update the content of a selected tag with javascript. All of my tags are created by a double nested for loop in django. But from what I've tried I've had no success.

Here is the javascript code:

$('td#'+new_data['piece_number']).html(new_data['img']);

Here is the double nested for loop in question:

<table id="table" bgcolor="{{puzzle.color_hash}}">
    <tbody>
    {% for x in n_rows %}
        <tr id='r{{x}}'>
            {% for y in n_cols %}
                <td id='{{count}}' height='{{puzzle.piece_res_height}}' width='{{puzzle.piece_res_width}}'>
                </td>
            {% endfor %}
        </tr>
    {% endfor %}
    </tbody>
</table>

I want the total iteration count in {{count}} but from my understanding django doesn't let you have variable manipulation in the renderer

I'm looking for a result such as a row by column table...

1 2 3

4 5 6

7 8 9

Where there are 3 rows and 3 columns. 9 pieces. each with a td id of the piece number

i.e. row 2 column 2 has a td id of 5

Upvotes: 1

Views: 153

Answers (1)

Jakub Kuszneruk
Jakub Kuszneruk

Reputation: 1240

You can send two wariables instead one count to html file and change ida of id naming.

<td id='r{{x}}d{{y}}' height='{{puzzle.piece_res_height}}' width='{{puzzle.piece_res_width}}'>

Edit - right solution

Ok, I have two solutions for you.

Both use custom template filters.

File app/templatetags/default_filters.py

from django import template
register = template.Library()

#first way
def mod(value, arg):
    return value % arg == 0

#second way
@register.filter(name='multiply')
def multiply(value, arg):
    return value*arg

register.filter('mod', mod)

Context send to template

class MainSiteView(TemplateView):
    template_name = "main_page.html"

    def get_context_data(self, **kwargs):
        context = super(MainSiteView, self).get_context_data(**kwargs)
        n_rows = n_cols = 2
        context['max_nums'] = n_rows * n_cols
        context['n_rows'] = [0, 1]
        context['n_cols'] = [0, 1]
        context['number_of_columns'] = 2
        context['range'] = [x for x in range(n_cols * n_rows)]
        return context

And template

{% load default_filters %}
<table id="_table" bgcolor="{{puzzle.color_hash}}">
    <tbody>
    {% for x in range %}
        {% if not forloop.counter|mod:number_of_columns %}
        <tr id='_r{{x}}'>
        {% endif %}
                <td id='_{{forloop.counter0}}' height='{{puzzle.piece_res_height}}' width='{{puzzle.piece_res_width}}'>
                    ({{forloop.counter0}})
                </td>
        {% if forloop.counter|mod:number_of_columns %}
        </tr>
        {% endif %}
    {% endfor %}
    </tbody>
</table>
<table id="table" bgcolor="{{puzzle.color_hash}}">
    <tbody>
    {% for x in n_rows %}
        <tr id='r{{x}}'>
            {% for y in n_cols %}
                <td id='{{x|multiply:number_of_columns|add:y}}' height='{{puzzle.piece_res_height}}' width='{{puzzle.piece_res_width}}'>
                    [{{x|multiply:number_of_columns|add:y}}]
                </td>
            {% endfor %}
        </tr>
    {% endfor %}
    </tbody>
</table>

Upvotes: 1

Related Questions