It looks like something simple and common, but I can’t find what’s wrong in my implementation.
I create a simple item add/edit form in my Django project for items by categories. The form will be located at /<category_id>/add. After filling data on form, it can just get category from category_id.
I try to fill this data in form_valid method of FormView, but all I got is error:
IntegrityError at /1/add NOT NULL constraint failed: megashop_item.category_id
I’ve tried print(“boo”) in my form_valid method - nothing is printed, looks like a validation throws exception before. Looks like it’s ItemCreateView validation, but how to fix it?
How to fix it? All examples are about using functions, not views.
models.py
class Category(models.Model):
title = models.CharField(max_length=200)
class Item (models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
forms.py
class ItemForm(forms.ModelForm):
class Meta:
model = Story
fields = ["title", "category"]
urls.py
urlpatterns = [
path("<int:category_id>/add", ItemCreateView.as_view(), name="item-add"),
]
views.py
class ItemCreateView(LoginRequiredMixin, CreateView):
model = Category
form_class = ItemForm
class ItemFormView(LoginRequiredMixin, FormView):
template_name = "megashop/item_form.html"
form_class = ItemForm
success_url = reverse_lazy("catalog:index")
def form_valid(self, form):
instance = form.save(commit=False)
instance.category= Category.objects.get(pk=self.kwargs.get('category_id'))
form.save()
return HttpResponseRedirect(self.get_success_url())