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