显示嵌套的ManyToMany关系

时间:2015-09-18 15:14:11

标签: django python-3.x

我在models.py中嵌套了很多关系,我的显示部分工作。我有两个问题:

  • 有没有办法简化演示文稿,例如by inlineformset?
  • 如何在模板表单中访问嵌套的上下文变量(参见{%for objective in selected_objectives%})?

如果有办法让我的问题更清楚,请告诉我

models.py

class Process(models.Model):
title = models.CharField(max_length=200)
desc = models.TextField('process description', blank=True)

def __str__(self):
        return self.title


class Objective(models.Model):
    process = models.ManyToManyField(Process, verbose_name="related processes", blank=False)
    title = models.CharField(max_length=200)
    desc = models.TextField('objective description', blank=True)

    def __str__(self):
        return self.title


class Risk(models.Model):
    objective = models.ManyToManyField(Objective, verbose_name="related objectives", blank=False)
    title = models.CharField(max_length=200)
    desc = models.TextField('risk description', blank=True)

    def __str__(self):
        return self.title

views.py

    @login_required
def detailed_list(request): 
    #context = RequestContext(request)
    obj = []
    ri = []

all_processes = Process.objects.order_by('id') #[:1]
for p_index,p in enumerate(all_processes):
    obj.append(p.objective_set.all()) #appending objectives for each process
    for o_index,o in enumerate(obj[p_index]):
        ri.append(o.risk_set.all().values()) #appending risks for each objective


context = {'all_processes': all_processes,
           'selected_objectives': obj,
           'selected_risks': ri
           }

return render(request, 'repository/detailed.html', context)

template detailed.html

<p><a href="{% url 'repository:process_create' %}">Create new Process</a>

</p>
{% if all_processes %}
No: {{ all_processes|length }}
    <ul>
    {% for process in all_processes %}



         <li><a href="{% url 'repository:process' process.id%}">{{ process.title }}</a> {{ forloop.counter0 }}</li>
        <ul>
        {% if selected_objectives %}

            {% for objective in selected_objectives %}
<!-- see here -->               <li><a href="{% url 'repository:objective' %}">{{ objective.title }}</a> {{ forloop.counter0 }} - {{ objective.desc }}</li>

            {% endfor %}

        {% else %}
        <p>No objectives are available.</p>
        {% endif %}
        </ul>

{% endfor %}
</ul>

{% else %}
    <p>No processes are available.</p>
{% endif %}

0 个答案:

没有答案