我在view.py
中有一个函数,它返回两个变量,即一个名为ca
的字典和一个名为categories
的列表:
def eventcateg_detail(request):
ca = EventTypeCategory.objects.values()
categories =[]
for i in range(0, len(ca)):
pk_sub = ca[i]['sub_categ_id']
if (pk_sub!=None):
category = EventTypeCategory.objects.get(id = pk_sub)
category = category.name
categories.append(category)
return render(request,"events/categ.html",{
'obj': ca,
'categ' :categories
})
categ
返回:
[u'Critical in list', u'Information in list', u'Amit Pal in list']
我的categ.html
是:
<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></td>
</tr>
{% endfor %}
</tbody>
</table>
我的输出应该是:
Event Category Event Message Sub-categories
Critical critical critical in list
Information information information in list
Amit Pal amit-pal amit pal in list
子类别包含来自列表的数据。我正在使用Event Category
(使用obj.name
)和Event Message
(使用obj.Message_slug
),但是我无法找到任何方法将子类别也放在同一个td
和循环相同(查看模板)。
答案 0 :(得分:2)
我建议你看一下:Django, category and subcategories
这可能需要对您的模型进行一些更改,但会大大简化您的代码。
<强>更新强>
我将回答你的第一个问题:)
你可以在你的情况下嵌套for循环:
<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%}