2015-09-18 2 views
0

У меня вложенные мною многие отношения в моих моделях.py, и у меня частично работает дисплей. У меня есть 2 вопроса:Отображение вложенных многопользовательских отношений

  • Есть ли способ упростить презентацию, например? inlineformset?
  • Как получить доступ к вложенным контекстным переменным в форме шаблона (см. Строку {% для цели в 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 detail.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

Спасибо! хорошо работал. –

Смежные вопросы