Как получить доступ к списку и словарю в одном цикле for на уровне шаблона в Django - PullRequest
0 голосов
/ 26 марта 2012

У меня есть функция в 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']

My 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 и то же самое для цикла(посмотрите на шаблон).

1 Ответ

2 голосов
/ 26 марта 2012

Я бы посоветовал вам взглянуть на это: Джанго, категории и подкатегории

Это, вероятно, потребует некоторых изменений в вашей модели, но значительно упростит ваш код.

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%}

...