2015-09-18 100 views
0

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

  • 有没有简化演示的方法,例如通过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

所有你所要做的仅仅是传递进程对象作为上下文到您的模板

context = {'all_processes': all_processes} 

和模板:

<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 all_processes.objective_set.all %} 
       {% for objective in all_processes.objective_set.all %} 
         <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 %} 

<!-- this is if you want to show risks --> 

{% for process in all_processes %} 
    {% for objective in all_processes.objective_set.all %} 
     {% for risk in objective.risk_set.all %} 
      {{ risk.desc }} 
     {% endfor %} 
    {% endfor %} 
{% endfor %} 

我希望这是你期待!

+0

谢谢!运作良好。 –