Ошибка Django Ошибка значения: Представление sub_categories.views.insert_sub_categories не вернуло объект HttpResponse. Вместо этого оно вернуло None

Передо мной стоит задача сделать проект шоппинга с моделями Товары, категории, подкатегории, размеры, цвета. Категории и подкатегории связаны через внешние ключи и я использую SERAILIZERS.Проблема в том, что когда я пытаюсь вставить данные в подкатегории, они не появляются ни в базе данных, ни на веб-странице. Я также пробовал значение = "{{c.category_name}}" в выпадающем списке select

ниже представлены модели

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)

функция показа и вставки подкатегорий

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 страницы вставки и страницы показа соответственно


                        <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 class="btn btn-primary">
                <i class="fa-solid fa-pen-to-square">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 class="btn btn-danger">
                <i class="fa-solid fa-trash">DELETE</i>
              </button>
            </a>
          </td>
        </tr>
      </tbody>

сериализатор категорий и подкатегорий

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__"

где я ошибаюсь в коде?

Попробуйте это

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)

Также вы используете какую-либо библиотеку для фронтенда вместе с ним? Как я вижу, ваш фронтенд рендерится из самого Django, так почему же drf?

Эта ошибка возникает потому, что в представлении вашей функции есть шанс, что она не возвращает правильный Response или Redirect объект. Если вы посылаете POST запрос, но форма не действительна, то она ничего не вернет.

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)

Также вы не передаете SUBCategories.category_name в ваш сериализатор. Это обязательное поле, поэтому без него файл никогда не будет валидным. Вы можете попробовать form = SUBCategoriesSerializer(request.POST) вместо того, чтобы добавлять значения по одному.

Попробуйте и дайте мне знать, несколько изменений, которые вы бы потребовали

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")
    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)

Форма части

<form method="POST">
    {% csrf_token %}
    <table>
        <thead>
            <tr>
                <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>Active</td>
                <td>
                    <input type="checkbox" name="isactive" value="true" checked>
                    
                </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>
            </tr>
        </thead>
    </table>
    <button class="btn btn-success"><a href="{% url 'sub_categories:show_sub_categories' %}" style="color: red;">Go To Home</a></button>

</form>

модель

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.category_name.category_name
Вернуться на верх