The key is to think about the structure you need for output when building up your data in the view. In this case, what you want is a simple nested list which includes *all* the data for each row - including the skill object. (Also, there's no need to pad your lists with "X" and spaces; use bools.) In other words, the list looks like:
[
[skill1, [True, False, False...],
[skill2, [True, False, True...].
...
]
So, in the view:
for s in skills:
v_skill = []
valeur = False
for a in achievements:
...
if...
valeur = True
v_skill.append(valeur)
v_table.append(skill, v_skill)
Now in the template you can simply do:
{% for skill, achievements in skills %}
<tr
{% if skill.is_key %}
style="font-weight:bold;"
{% endif %}
>
<td style="text-align:right">{{ skill.code }}</td>