Django. Добавление внешнего ключа к другой модели в представлении
Предположим, у меня есть две модели:
- Модель корзины
- Модель яблока
В одной корзине может быть много яблок, поэтому между корзиной и яблоком существует отношение "один ко многим". Например, вот мои модели:
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/