I am doing CRUD data which has foreign keys and serializers(since I am told to use serializers instead of Forms),even though I have put the correct model and it’s names in the product_edit page, the data is showing blank instead of thier saved data ,the wrong sub_category name is coming,this is how the edit page currently looks
serializer:
class CategoriesSerializer(serializers.ModelSerializer): class Meta: model = Categories fields = "__all__" extra_kwargs = {'category_name': {'required': False}} class ColorsSerializer(serializers.ModelSerializer): class Meta: model = Colors fields = "__all__" class POLLSerializer(serializers.ModelSerializer): # categories = serializers.StringRelatedField(many=False) # sub_categories = serializers.StringRelatedField(many=False) # color = serializers.StringRelatedField(many=False) # size = serializers.StringRelatedField(many=False) class Meta: model = Products fields = "__all__" class SizeSerializer(serializers.ModelSerializer): class Meta: model = Size fields = "__all__" class SUBCategoriesSerializer(serializers.ModelSerializer): class Meta: model = SUBCategories fields = "__all__"
below are the models of my CRUD
class Products(models.Model): categories = models.ForeignKey(Categories,on_delete=models.CASCADE) sub_categories = models.ForeignKey(SUBCategories,on_delete=models.CASCADE) color = models.ForeignKey(Colors,on_delete=models.CASCADE) size = models.ForeignKey(Size,on_delete=models.CASCADE) # image = models.ImageField(upload_to = 'media/',width_field=None,height_field=None,null=True) title = models.CharField(max_length=50) price = models.CharField(max_length=10) sku_number = models.CharField(max_length=10) product_details = models.CharField(max_length=300) quantity = models.IntegerField(default=0) isactive = models.BooleanField(default=True)
class Categories(models.Model): #made changes to category_name for null and blank category_name = models.CharField(max_length=20) category_description = models.CharField(max_length=20) isactive = models.BooleanField(default=True) def __str__(self): return self.category_name
class Colors(models.Model): color_name = models.CharField(max_length=10) color_description = models.CharField(max_length=10) isactive = models.BooleanField(default=True) def __str__(self): return self.color_name
class Size(models.Model): size_name = models.CharField(max_length=10) size_description = models.CharField(max_length=20) isactive = models.BooleanField(default=True) def __str__(self): return self.size_name
class SUBCategories(models.Model): category_name = models.ForeignKey(Categories, on_delete=models.CASCADE) sub_categories_name = models.CharField(max_length=20) sub_categories_description = models.CharField(max_length=20) isactive = models.BooleanField(default=True) def __str__(self): return self.sub_categories_name
update function
def update(request,id): if request.method == 'GET': print('GET',id) edit_products = SUBCategories.objects.filter(id=id).first() s= SUBCategoriesSerializer(edit_products) category_dict = Categories.objects.filter(isactive=True) category = CategoriesSerializer(category_dict, many=True) sub_category_dict = SUBCategories.objects.filter(isactive=True) sub_category = SUBCategoriesSerializer(sub_category_dict,many=True) color_dict = Colors.objects.filter(isactive=True) color = ColorsSerializer(color_dict,many=True) size_dict = Size.objects.filter(isactive=True) size = SizeSerializer(size_dict,many=True) hm = {"context": category.data,"sub_context":sub_category.data,"color_context":color.data,"size_context":size.data,"SUBCategories":s.data} return render(request,'polls/product_edit.html',hm) else: print('POST',id) editproducts = {} d = Products.objects.filter(id=id).first() if d: editproducts['categories']=request.POST.get('categories') editproducts['sub_categories']=request.POST.get('sub_categories') editproducts['color']=request.POST.get('color') editproducts['size']=request.POST.get('size') editproducts['title']=request.POST.get('title') editproducts['price']=request.POST.get('price') editproducts['sku_number']=request.POST.get('sku_number') editproducts['product_details']=request.POST.get('product_details') # print(editsubcategories) form = SUBCategoriesSerializer(d,data= editproducts) if form.is_valid(): form.save() print("form data",form.data) print('form error',form.errors) messages.success(request,'Record Updated Successfully...!:)') return redirect('polls:show') else: print(form.errors) return redirect("polls:show")
where am I going wrong in the code?
Advertisement
Answer
you must create product serializer like below
class ProductSerial(ModelSerializer): class Meta: model = Products fields = '__all__'
and pass editproducts
to this serializer
and also you have to be careful that pass id
‘s of
categories sub_categories color size
into request.POST data