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-поле в вашей модели, а затем добавьте учителей соответственно.
Внесетевое руководство по линейным наборам форм:
Используя предложение, данное 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