Doesnt save "Category"

Like in the topic title form doesnt save the products category after selected. It does save the form but not the category.
Here is my codes:
Model form:

class Products(models.Model):
    product_name = models.CharField(max_length=255, verbose_name="Ürün Adı")
    product_category = models.ManyToManyField(Categories,related_name="products",verbose_name="Ürün Kategorisi",help_text="Birden fazla kategori seçmek için CTRL tuşuna basılı tutunuz. \n Aynı zamanda seçimi iptal etmek için CTRL tuşuna basılı tutup seçimi iptal edilmek istenen kategoriye tıklayın.")
    
    #product_category = models.ForeignKey(Categories, on_delete=models.CASCADE,related_name='products' ,null=True)
    product_description = models.TextField(null=True,verbose_name="Ürün Açıklaması")
    product_price = models.DecimalField(max_digits=9,decimal_places=2,verbose_name="Ürün Fiyatı")    
    product_image = models.ImageField(upload_to='products/',verbose_name="Ürün Görseli")   

    def __str__(self):
        return self.product_name
 

    
    class Meta:
        # Admin panelinde nasıl gözükeceği
        verbose_name= 'Ürün'
        verbose_name_plural = 'Ürünler'

View function:

@login_required
# Obje ekleme fonksiyonu
def dynamic_model_item_add(request,app_label, model_name):
   if request.user.is_superuser:
  
    
    # Modeli getir
    try:
        model = apps.get_model(app_label, model_name)
    except LookupError:
        raise Http404("Böyle bir model bulunamadı.")

    # Model nesnelerini ve adını al
    model_objects = model.objects.all()
    verbose_name = model._meta.verbose_name_plural

    # Dinamik Model Formu oluştur
    ModelForm = modelform_factory(model, fields="__all__")

    if request.method == "POST":
        form = ModelForm(request.POST, request.FILES)
        is_sub_cat = request.POST.get("is_subs") == "on" # Onay kutusu seçilmiş mi ?
        parent_category_id = request.POST.get("parent_category") # Seçilen üst kategori

        if form.is_valid():
            new_obj = form.save(commit=False)
            new_obj.is_sub_cat = is_sub_cat
            new_obj.save()
            if is_sub_cat:
                if not parent_category_id:
                    form.add_error(None,"Alt Kategori olarak belirlediğiniz öğenin bir üst kategorisi olmalıdır!")
                else:
                    try:
                        parent_cat = Categories.objects.get(id=parent_category_id)
                        parent_cat.sub_categories.add(new_obj)
                        new_obj.save()
                        messages.success(request, 'Başarıyla eklendi!')
                        #new_obj.sub_categories.add(parent_cat)
                        #new_obj.parent_categories = Categories.objects.get(id=parent_category_id)
                    except Categories.DoesNotExist:
                        form.add_error =(None,"Seçilen üst kategori bulunamadı.")
            else:
                new_obj.save()
               
                messages.success(request, 'Başarıyla eklendi!')
            
            
            
            return redirect(reverse("intern_app:add_model", kwargs={"app_label": app_label, "model_name": model_name}))  
    else:
        form = ModelForm()
    
 
    categories = Categories.get_main_categories  # Sadece ana kategoriler

    context = {
        "model_objects": model_objects,
        "verbose_name": verbose_name,
        "form": form,
        "categories": categories,
        "model_name": model_name
    }

    return render(request, "intern_app/custom_admin_add_item.html", context)

Okay i solve the problem by adding form.save_m2m() right under the new_obj.save()

 if form.is_valid():
            new_obj = form.save(commit=False)
            new_obj.is_sub_cat = is_sub_cat
            new_obj.save()
            form.save_m2m()
          

Do you solve your problem yourself?

Yeah. Is it wrong to solve it by myself ?

Absolutely no… moreover, it is good and super :+1:

1 Like