Django Forms позволяет пользователю вводить список кортежей неизвестной длины

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

Например:

  • На уроке 1 работают следующие преподаватели
    • роль: руководитель, имя: Боб
    • роль: пример, имя: Адам
    • роль: помощник, имя: Джой

Поскольку роли неизвестны и количество инструкторов неизвестно, форма должна быть способна принимать список "кортежей". Каждый кортеж должен иметь текстовое поле и поле выбора (выбор из списка инструкторов).

Затем данные будут сохранены в этой модели:

class MapInstructorTeach(models.Model):
    teach = models.ForeignKey(Teach, on_delete=models.CASCADE)
    instructor = models.ForeignKey(Instructor, on_delete=models.CASCADE)
    role = models.CharField(max_length=32)

Модель Teach - это просто модель, указывающая название урока. Модель instructor представляет собой список инструкторов.

Как мне создать класс forms.py и html для чего-то подобного? Я даже не знаю, с чего начать.

Попытки jQuery бесконечная форма ввода Я пробовал использовать вышеуказанный метод для создания полей во фронт-энде, но не смог найти способ связать поля ввода с бэкэндом.

Я настоятельно рекомендую взглянуть на наборы встроенных форм или наборы форм в целом. Используя наборы форм, вы можете использовать несколько форм на странице, а с помощью встроенных наборов форм вы можете привязать эти формы к родительской форме. Подумайте о следующем:

  • Колледж будет иметь несколько преподавателей, количество неизвестно
  • Преподаватель будет иметь внешний ключ к колледжу.
  • Вы можете захотеть добавить преподавателей при "создании" колледжа
Таким образом, используя наборы встроенных форм, вы можете иметь форму колледжа, а затем все формы преподавателей на той же странице, уже привязанные к этой форме колледжа.

Формсеты сами по себе позволяют все это, без привязки к модели.

С помощью javascript можно добавить кнопку для динамического добавления новых форм. Больше информации на этой заметке

Если вы действительно хотите использовать только внешние формы

Используйте JSON-поле в вашей модели, а затем добавьте учителей соответственно.

Внесетевое руководство по линейным наборам форм:

techincent.com

Используя предложение, данное nigel239, я создал модель формы и inlineformset_factory, чтобы получить желаемый результат.

forms.py

class AssignSeniorForm(ModelForm):
    BLANK_CHOICE_SENIOR = [("", "Senior")]
    BLANK_CHOICE_DASH = BLANK_CHOICE_DASH

    role = forms.CharField(max_length=32)
    senior = forms.ChoiceField(choices=[])

    def __init__(self, *args, night_id, senior_choices, **kwargs):
        super(AssignSeniorForm, self).__init__(*args, **kwargs)

        self.night_id = night_id
        self.fields["senior"].choices = (
            self.BLANK_CHOICE_SENIOR + self.BLANK_CHOICE_DASH + senior_choices
        )

    class Meta:
        model = MapSeniorNight
        fields = ["role", "senior"]

    def clean(self):
        cleaned_data = self.cleaned_data
        senior_id = cleaned_data.get("senior")
        senior_instance = Senior.get_by_id(senior_id)
        cleaned_data.update({"senior": senior_instance})

        return cleaned_data

AssignSeniorFormset = inlineformset_factory(
    TrainingNight, MapSeniorNight, form=AssignSeniorForm, extra=2
)

и затем я использовал AssignNightFormset в моем views.py

Вернуться на верх