Есть задача - создать приложение "Календарный план" на Django.
Получилась такая модель:
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
import mptt
class Schedule(models.Model):
title = models.TextField(verbose_name='Название графика', default='План-график', null=False, blank=False)
contract = models.ForeignKey('contracts.Contract', verbose_name='Договор', default='', blank=True, null=True, related_name='schedules')
system = models.ForeignKey('isystems.iSystem', verbose_name='Система', default='', blank=True, null=True, related_name='schedules')
link = models.URLField(verbose_name='Ссылка на скан', blank=True, null=True)
def __str__(self):
return self.title
class Meta:
ordering = ['system']
verbose_name = 'План-график'
verbose_name_plural = 'План-графики'
class Step(MPTTModel):
schedule = models.ForeignKey('Schedule', verbose_name='План-график', blank=False, null=False, related_name='steps')
step_num = models.PositiveSmallIntegerField(verbose_name='Номер этапа', default='', null=True, blank=True)
title = models.TextField(verbose_name='Этап', default='', null=False, blank=False)
date_begin = models.DateField(verbose_name='Дата начала', null=True, blank=True)
date_end = models.DateField(verbose_name='Дата завершения', null=True, blank=True)
org_executors = models.ManyToManyField('organizations.Organization', verbose_name='Исполнители', blank=True)
man_executors = models.ManyToManyField('people.People', verbose_name='Исполнители', blank=True)
parent = TreeForeignKey('self', verbose_name='Родительский этап', null=True, blank=True, related_name='children', db_index=True)
done = models.BooleanField(verbose_name='Этап завершен', default=False)
report = models.TextField(verbose_name='Результат этапа', default='', null=True, blank=True)
def __str__(self):
return '{}. {}'.format(self.step_num, self.title)
class Meta:
ordering = ['date_begin']
verbose_name = 'Этап'
verbose_name_plural = 'Этапы'
class MPTTMeta:
order_insertion_by = ['schedule']
mptt.register(Step, )
Вопросы:
1. Правильно ли организована модель? Может, есть уже готовые, проверенные шаблоны?
2. Как выводить план-график в html? Использую следующую конструкцию:
{% load mptt_tags %}
<ul>
{% recursetree schedule.steps.all %}
<li>
{{ node.parent.step_num}}. {{ node.step_num }} - {{ node.title }}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
Получаю в итоге нумерацию "родитель"."нода". Как получить полную нумерацию, если уровень иерархии больше 2? - это решил!
вместо: {{ node.parent.step_num}}. {{ node.step_num }} - {{ node.title }}
сделал так: {% for parent_node in node.get_ancestors %}{{ parent_node.step_num }}.{% endfor %}{{ node.step_num }} - {{ node.title }}
3. Как в админке ограничивать выбор родительского этапа только этапами текущего плана-графика?
4. Вывожу список всех планов следующим способом:
<tbody>
{% for chart in schedules %}
<tr>
<td><a href="{% url 'schedule_charts:detail' chart.id %}">{{ chart.title }}</a></td>
<td>{% if chart.system %}<a href="{% url 'isystems:detail' chart.system.id %}">{{ chart.system }}</a>{% endif %}</td>
<td>{% if chart.contract %}<a href="{% url 'contracts:detail' chart.contract.id %}">{{ chart.contract.sed_number }} от {{ chart.contract.reg_date }}</a>{% endif %}</td>
</tr>
{% endfor %}
</tbody>
Как добавить поля "Самая ранняя дата в календарном плане" и "Самая поздняя дата.."?
views.py
class ScheduleList(ListView):
model = Schedule
def get_context_data(self, **kwargs):
context = super(ScheduleList, self).get_context_data(**kwargs)
context['schedules'] = Schedule.objects.all()
return context
class ScheduleInfo(DetailView):
model = Schedule
context_object_name = 'schedule'
class StepsList(ListView):
model = Step
def get_context_data(self, **kwargs):
context = super(StepsList, self).get_context_data(**kwargs)
context['steps'] = Step.objects.all()
return context
Спасибо!