Django ModelMultipleChoiceField

Я новичок в Django и делаю свое первое реальное приложение. Мне нужен совет по созданию страницы с тремя зависимыми полями выбора модели или другим подобным интерфейсом. Цель состоит в том, чтобы создать страницу, где пользователь может выбрать целевые папки из трехуровневой структуры папок и сохранить выбор пользователя в БД для дальнейшего использования. Я хочу создать три списка, содержащих L1, L2 и L3 имен папок каждый, где пользователь выбирает любую доступную папку. Если пользователь меняет выбор в списке L1, он должен автоматически обновить список L2, то же самое правило в списке L2 для списка L3. Из-за ограничений безопасности я не могу получить доступ к файловой системе с dirs с сервера Django. Но к ней можно получить доступ с пользовательского ПК. Я догадался вручную загружать структуру dirs, так как она редко меняется.

Вопрос в том, как внедрить эти списки на страницу и сделать их зависимыми. Я предполагаю, что это должно быть три модельных поля с несколькими вариантами выбора с некоторым событием JavaScript для их обновления. Но мне нужен пример, как это сделать. Может быть, есть другой лучший способ, чем использование ModelMultipleChoiceField...

Пример dirs - древовидной структуры:

|-L1_Dir#1 -|-L2_Dir#A-|-L3_Dir#P
|           |          |-L3_Dir#Q 
|           |          
|           |-L2_Dir#B-|-L3_Dir#R
|                      |-L3_Dir#S
|                      
|-L1_Dir#2 -|-L2_Dir#C-|-L3_Dir#T
                       |-L3_Dir#U

Я создал структуру models.py:

from django.db import models
# Create your models here.
class L1_dir(models.Model):
    name = models.CharField(max_length = 48)
    def __str__(self):
        return(self.name)

class L2_dir(models.Model):
    name = models.CharField(max_length = 48)
    l1_dir = models.ForeignKey(L1_dir, on_delete = models.CASCADE) 
    
    def __str__(self):
        return(self.name)

class L3_dir(models.Model):
    path = models.CharField(max_length = 256) #store full path here
    name = models.CharField(max_length = 48)  
    l2_dir = models.ForeignKey(L2_dir, on_delete = models.CASCADE)
    def __str__(self):
        return(self.dir_name)

Вы можете использовать одну модель, чтобы справиться с этой ситуацией.

class LocationDir(models.Model):
    path = models.CharField(max_length = 256)
    name = models.CharField(max_length = 48)
    directory = models.ForeignKey('self', on_delete = models.CASCADE, null=True, blank=True)

    def __str__(self):
        return self.name
Вернуться на верх