Django: Предварительное заполнение набора форм отношениями ManyToMany и дополнительными полями
У меня есть две модели с M2M-отношениями и дополнительными полями: Меню - это компиляция многих курсов (т.е. блюд). Отношение M2M отражено в классе/таблице MenuItem
. MenuItem
имеет два дополнительных поля: course_type
(т.е. стартер, закуска и т.д.) и course_position
(для отслеживания позиции).
models.py
class Menu(models.Model):
creator = models.ForeignKey(User, related_name='creator_id_menu', on_delete=models.PROTECT)
menu_name = models.CharField(max_length=100, default='', verbose_name=_('menu name'), help_text=_('i.e. saturday night fajita night'))
menu_description = models.CharField(max_length=300, default='', verbose_name=_('menu description'), help_text=_('this menu will blow your mind...'))
menu_item = models.ManyToManyField(Course, through='MenuItem', blank=True)
class Course(models.Model):
creator = models.ForeignKey(User, related_name='creator_id_course', on_delete=models.PROTECT)
course_name = models.CharField(max_length=100, help_text=_('give your creation a nice name!'))
course_description = models.CharField(max_length=300, default='', verbose_name=_('course description'), help_text=_('give your creation a brief description!'))
class MenuItem(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, verbose_name=_('menu name'))
course = models.ForeignKey(Course, on_delete=models.PROTECT, verbose_name=_('course name'))
course_type = models.CharField(choices=CourseType.choices, max_length=3, verbose_name=_('course type'))
course_position = models.PositiveSmallIntegerField(verbose_name=_('course position'))
forms.py
class CourseForm(forms.ModelForm):
course_type = forms.ChoiceField(choices=MenuItem.CourseType.choices)
course_description = forms.Textarea()
class Meta:
model = Course
fields = ['course_name', 'course_description']
CourseFormset = modelformset_factory(Course,
form=CourseForm,
extra=0)
Я могу заполнить ModelFormset данными из Course
, но не знаю, как правильно обратиться к экземпляру MenuItem
. Поэтому мой views.py
пропускает request.POST
обработку.
views.py
def update_menu_with_courses(request, pk):
context = {}
menu_instance = Menu.objects.get(id=pk)
# initializing forms
menu_form = MenuCreationForm(request.POST or None, instance=menu_instance)
menu_items = menu_instance.menu_item.all()
course_formset = CourseFormset(request.POST or None, queryset=menu_items, prefix='course')
context['menu_form'] = menu_form
context['course_formset'] = course_formset
return render(request, 'menus/update_menu_courses.html', context)
Мой вопрос:
- Как предварительно заполнить ModelFormset отношениями M2M и дополнительными полями в таблице M2M.
- Как обновить дополнительные поля M2M в
MenuItem
.