Я бы посоветовал вам взглянуть на это: Джанго, категории и подкатегории
Это, вероятно, потребует некоторых изменений в вашей модели, но значительно упростит ваш код.
UPDATE
Я отвечу на ваш первый вопрос:)
Вы можете вкладывать петли, поэтому в вашем случае:
<thead>
<tr><th>{% trans "Name Category" %}</th><th>{% trans " Message" %}</th><th>{% trans "Sub-categories" %}</th></tr>
</thead>
<tbody>
{% for obj in obj %}
<tr>
<td>{{ obj.name }}</td><td> {{ obj.Message_slug }}</td>
<td>
{% for i in categ %}
{{ i }}
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
Тем не менее! Приведенный выше код указывает на слабость в вашем методе eventcateg_detail. Список, который вы создаете, не говорит, к какой родительской категории принадлежит элемент списка, поэтому для каждого родительского объекта будут напечатаны все элементы.
Если вы знаете, что всегда будут взаимно-однозначные отношения и всегда будет один ребенок, вы можете создать словарь вместо него
Кроме того, я считаю, что ваш исходный код может быть упрощен:
def eventcateg_detail(request):
ca = EventTypeCategory.objects.all()
categories ={}
for cat in ca:
if cat.sub_categ_id:
#Since the ca queryset already contains all items you can use that to get the child category
category = ca.objects.get(id=cat.sub_categ_id)
#Add to dictionary. NOTE: If you ever get more than one sub-category
#you need to build a list of sub-categories before adding it to the dict.
categories[cat.id] = category.name
return render(request,"events/categ.html",{ 'obj': ca, 'categ' :categories})
В вашем шаблоне вы делаете это:
<thead>
<tr>
<th>{% trans "Name Category" %}</th>
<th>{% trans " Message" %}</th><th>{% trans "Sub-categories" %}</th>
</tr>
</thead>
<tbody>
{% for o in obj %}
<tr>
<td>{{ o.name }}</td><td> {{ o.Message_slug }}</td>
<td>
{% for key, value in categ.items %}
{% ifequal key o.id %}
{{ value }}
{% endifequal %}
{% endfor %}
</td>
</tr>
{% endfor%}