Задать вопрос
whitehunter
@whitehunter

Как сделать древовидные SELECT'ы в DjangoAdmin и FormModel используя MPTT?

Доброе время суток!
Новичок в Django и Python. Возник вопрос.

Есть модель с использованием MPTT для описания древовидной структуры подразделений компании.
class Department (MPTTModel):
    title = models.CharField(max_length=500, verbose_name='Названием')
    abbreviation = models.CharField(max_length=25, verbose_name='Кратко', blank=True)
    parent = TreeForeignKey('self', blank=True, null=True, verbose_name='Родитель', related_name='child')
    class MPTTMeta:
        order_insertion_by = ['title']
    def dep_tree(self):
        return str(self.get_ancestors())
    def __str__(self):
        return self.title

class Employee (models.Model):
    common_name = models.CharField (max_length = 300, verbose_name='ФИО')
    department = models.ForeignKey (Department, verbose_name='Подразделение', null=True, blank=True)
   ...
mptt.register(Department,)


При ручном создании формы, для редактирования сущностей Employee я использую TreeNodeChoiceField из MPTT. Как итог в форме в SELECT у меня получатся древовидная структура. (используются отступу -"--"). Все понятно все работает.
class MyForm (forms.Form):
    Department = TreeNodeChoiceField(required=False, queryset=Department.objects.all(), level_indicator = u'---',)


Но хотелось бы, чтобы к SELECT'ам в формах админки и в автоматически создаваемых формах. В поле deparment применялся TreeNodeChoiceField. Т.е. на данный момент в админке все плоское, и в формах на основе ModelForm тоже

class EmployeeForm (ModelForm):
    class Meta:
        model = Employee
        fields = ['common_name', 'department', 'position', 'address', 'work_phone', 'cell_phone', 'ip_phone']
  • Вопрос задан
  • 2661 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
В EmployeeForm можно задать поле department точно так же, как вы это сделали в MyForm. Альтернатива - атрибут formfield_overrides в ModelAdmin.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы