Home > OS >  Django error value error: The view sub_categories.views.insert_sub_categories didn't return an
Django error value error: The view sub_categories.views.insert_sub_categories didn't return an

Time:07-06

I am tasked with making a shopping crud project with models Products,categories,sub_categories,size,colors. Categories and subcategories are connected via foreign keys and I am using SERAILIZERS.the problem is that when I try to insert the data into sub Categories it doesnt come in both the database and the webpage I also tried value = "{{c.category_name}}" as well in select dropdown as well

below are the models

class Categories(models.Model):
    category_name = models.CharField(max_length=10)
    category_description = models.CharField(max_length=10)
    isactive = models.BooleanField(default=True)
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)

show and insert function of sub_categories

def show_sub_categories(request):
    showsubcategories = SUBCategories.objects.filter(isactive=True)
    #print(showsubcategories)
    serializer = SUBCategoriesSerializer(showsubcategories,many=True)
    print(serializer.data)
    return render(request,'polls/show_sub_categories.html',{"data":serializer.data})

def insert_sub_categories(request):
    if request.method == "POST":
        insertsubcategories = {}
        insertsubcategories['sub_categories_name']=request.POST.get('sub_categories_name')
        insertsubcategories['sub_categories_description']=request.POST.get('sub_categories_description')
        form = SUBCategoriesSerializer(data=insertsubcategories)
        
        if form.is_valid():
            form.save()
            print("hkjk",form.data)
            messages.success(request,'Record Updated Successfully...!:)')
            print(form.errors)
            return redirect('sub_categories:show_sub_categories')
        else:
            print(form.errors)

    else:
        insertsubcategories = {}
        form = SUBCategoriesSerializer(data=insertsubcategories)
        category_dict = Categories.objects.filter(isactive=True)
        category = CategoriesSerializer(category_dict,many=True)
        hm = {'context': category.data}
        if form.is_valid():
            print(form.errors)
        return render(request,'polls/insert_sub_categories.html',hm)

html of the insert page and show page respectively


                        <td>category name</td>
                        <td>
                            <select name="category_name" id="">
                                {% for c in context %}
                                   <option value="{{c.id}}">{{c.category_name}}</option> 
                                {% endfor %}
                            </select>
                        </td>
                    </tr>
                    <tr>
                        <td>sub categories Name</td>
                        <td>
                            <input type="text" name="sub_categories_name" placeholder="sub categories ">
                        </td>
                    </tr>
                    <tr>
                        <td>Sub categories Description</td>
                        <td>
                            <textarea name="sub_categories_description" id="" cols="30" rows="10">

                            </textarea>
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <input type="submit" value="Insert" />
                        </td>
                        <td>
                            {% if messages %}
                            {% for mess in messages %}
                            <b style="color:green;">{{mess}}</b>
                            {% endfor %}
                            {% endif %}
                        </td>
                    
<tbody>
        <tr>
          <td><b>{{result.sub_categories_name}}</b></td>
          <td><b>{{result.sub_categories_description}}</b></td>
          <td style="position: relative;left:50px;">
            <a href="sub_categories/edit_sub_categories/{{result.id}}">
              <button >
                <i >EDIT</i>
              </button>
            </a>
          </td>
          <td>
            <a href="{% url 'sub_categories:delete_sub_categories' result.id %}" onclick="return confirm('Are You Sure you want to delete?')">
              <button >
                <i >DELETE</i>
              </button>
            </a>
          </td>
        </tr>
      </tbody>

categories and sub categories serializer

class CategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categories
        fields = "__all__"
        extra_kwargs = {'category_name': {'required': False}}

class SUBCategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = SUBCategories
        fields = "__all__"

where am I going wrong in the code?

CodePudding user response:

This error occurs because there is a chance in your function view, that it does not return proper Response or Redirect object. If you send POST request, but the form is not valid, then it will not return anything.

def insert_sub_categories(request):
    if request.method == "POST":
        ...
        
        if form.is_valid():
            ...
            return redirect('sub_categories:show_sub_categories')
        else:
            print(form.errors)
            # HERE YOU MISS REDIRECT/RENDER
    else:
        ...
        return render(request,'polls/insert_sub_categories.html',hm)

Also you don't pass SUBCategories.category_name to your serializer. It's required field, so it will never be valid without it. You may try form = SUBCategoriesSerializer(request.POST) instead of adding values one by one.

CodePudding user response:

Try this

def insert_sub_categories(request):
    if request.method == "POST":
        form = SUBCategoriesSerializer(data=request.POST)        
        if form.is_valid():
            form.save()
            messages.success(request,'Record Updated Successfully...!:)')
            return redirect('sub_categories:show_sub_categories')
        else:
            print(form.errors)

    else:
        form = SUBCategoriesSerializer()
        category_dict = Categories.objects.filter(isactive=True)
        category = CategoriesSerializer(category_dict,many=True)
        hm = {'context': category.data}
    return render(request,'polls/insert_sub_categories.html',hm)

Also are you using any frontend library along with it? as I see your frontend is rendering from Django itself, so why drf?

  • Related