Что касается самой модели, вы просто думаете об этом в неправильном направлении. Вместо
children = models.ManyToManyField("self", blank=True)
использование
parent = models.ForeignKey("self", blank=True, related_name="children")
Это позволит вам получить доступ к дочерним элементам непосредственно из записи страницы, но должно быть более простым представлением в базе данных.
Рендеринг HTML обычно должен происходить в представлениях, а не в модели. Используйте mptt, как подсказывает медер.