Последовательное добавление, удаление и редактирование формы поля "многие ко многим
Уже существует довольно много вопросов (1, 2, 3 и т.д.) об этом, но без (хороших) ответов.
Рабочий код
У меня есть одна модель для сотрудника и другая для рабочих часов. Я хочу связать их отношениями "многие-ко-многим". Для этого я хочу создать форму для их добавления, удаления и редактирования. Пока что я могу только выбрать их из списка всех отношений.
models.py
class WeekdayHour(models.Model):
"""Model representing a business hours in for specific weekdays."""
WEEKDAYS = [
(1, _("Monday")),
(2, _("Tuesday")),
(3, _("Wednesday")),
(4, _("Thursday")),
(5, _("Friday")),
(6, _("Saturday")),
(7, _("Sunday")),
]
weekday = models.IntegerField(choices=WEEKDAYS)
from_hour = models.TimeField()
to_hour = models.TimeField()
class Employee(models.Model):
"""Model representing a user employee."""
name = models.CharField(max_length=50)
business_hours = models.ManyToManyField('WeekdayHour', through='WeekdayHourEmployee')
class WeekdayHourEmployee(models.Model):
weekday_hour = models.ForeignKey('WeekdayHour', on_delete=models.RESTRICT)
employee = models.ForeignKey('Employee', on_delete=models.RESTRICT)
class Meta:
unique_together = ('weekday_hour', 'employee')
Причиной использования промежуточной таблицы является определение уникального ограничения together.
Далее я определяю форму следующим образом.
forms.py
class EmployeeForm(ModelForm):
# define the specific widget for the business hours
business_hours = forms.ModelMultipleChoiceField(
queryset=WeekdayHour.objects.all(),
widget=forms.CheckboxSelectMultiple
)
class Meta:
model = Employee
fields = ('name', 'business_hours')
На данный момент у меня есть форма, отображающая рабочие часы, которая выглядит следующим образом:
(я опускаю код макета для краткости, но он основан на этом посте)
Экспериментальный код
Это только половина того, что я хочу. В идеале, это должно выглядеть следующим образом:
Я пытался сделать это с помощью встроенных наборов форм, но не смог найти хорошего способа сделать это с полями "многие ко многим". Почему-то всегда возникает ошибка на таблице в середине. Следующий код - это самое удачное, чего я добился.
forms.py
class WeekdayHourForm(ModelForm):
class Meta:
model = WeekdayHour
fields = ('weekday', 'from_hour', 'to_hour')
EmployeeBusinessHourFormset = forms.inlineformset_factory(Employee, WeekdayHour, WeekdayHourForm)
views.py
class EmployeeUpdateView(UpdateView):
model = Employee
form_class = EmployeeBusinessHourFormset
В зависимости от того, что я беру в inlineformset, я получаю одну из следующих ошибок:
Unknown field(s) (to_hour, weekday, from_hour) specified for WeekdayHourEmployee
или ValueError: 'automate.WeekdayHour' has no ForeignKey to 'automate.Employee'.
Похоже, что двойная ссылка мешает работе набора форм.