Django. Добавление внешнего ключа к другой модели в представлении

Предположим, у меня есть две модели:

  1. Модель корзины
  2. Модель яблока

В одной корзине может быть много яблок, поэтому между корзиной и яблоком существует отношение "один ко многим". Например, вот мои модели:

class Basket(models.Model):
    backet_name = models.CharField(max_length=150)
    owner = author = models.ForeignKey(get_user_model(), on_delete = models.CASCADE)

class Apples(models.Model):
    apple_sort = models.CharField(max_length=150)
    apple_size = models.CharField(max_length=150)
    basket = models.ForeignKey(Basket, on_delete=models.CASCADE, related_name="apple_in_basket")

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

class NewBasketForm(ModelForm):
    class Meta:
        model = Basket
        exclude = ['owner']


class AddAppleToBasket(ModelForm):
    class Meta:
        model = Apple
        exclude = ['basket']

AppleFormSet = modelformset_factory(Apple, form=AddAppleToBasket, extra=1, max_num=10)

Я хочу, чтобы мои яблоки автоматически устанавливали внешний ключ на корзину, которую я только что создал. Поэтому я создал представление для вставки объектов Basket и Apple в базу данных:

class BascketAddView(View):
    form_class_for_basket = NewBasketForm
    form_class_for_apples = AppleFormSet
    template_name = 'buskets/add.html'

    def get(self, request, *args, **kwargs):
        basket_form = self.form_class_for_apples()
        apples_form = self.form_class_for_answers()

        return render(request, self.template_name, {'basket_form': basket_form, 'apples_form': apples_form})

    def post(self, request, *args, **kwargs):
        basket_form = self.form_class_for_basket(request.POST)
        apple_form = self.form_class_for_apples(request.POST)
        if basket_form.is_valid() and apple_form.is_valid():
            print("form is valid!!!")
            new_basket = basket_form.save(commit=False)
            new_basket.owner = request.user
            new_basket.save()
            instances = apple_form.save(commit=False)
            for instance in instances:
                instance.basket = new_basket
                instance.save()

            return HttpResponseRedirect('/')

        print("form is invalid")
        return render(request, self.template_name, {'basket_form': busket_form, 'apples_form': apples_form})

Форма отображается нормально, но когда я заполняю ее и отправляю, в консоли появляется сообщение "форма недействительна". Что я делаю не так?

Я нашел решение!

Что ж, если кто-то наткнется на подобную ошибку, попробуйте добавить {{ formset.management_form }} в ваш шаблон, где отображается форма, внутри тега <form method="post>:

Итак, в моем случае я должен добавить:

  <form method="post" enctype='multipart/form-data'>
    {{ apple_form.management_form }}
    {% for form in apple_form %}
  </form>

Больше информации в документации Django: https://docs.djangoproject.com/en/4.1/topics/forms/formsets/

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