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
  • .
Вернуться на верх