Почему моя форма django создает новый объект для неправильной модели

Я создаю список с иерархической базой данных Название -> Категория -> Подкатегория с помощью прокси (по это видео). Пользователь сначала видит таблицу с названиями и статусами, затем он может нажать на одно из названий, чтобы перейти на следующую страницу с таблицей названий и статусов категорий, а затем он может нажать на одну из этих категорий, чтобы перейти на следующую страницу с таблицей названий и статусов подкатегорий.

.

Я хочу создать форму, которая будет добавлять новое название и новый статус для моей категории или подкатегории. Но когда я отправляю форму, неважно, TitleForm, CategoryForm или SubcategoryForm, я всегда получаю новый объект Title, но никогда объект Category или Subcategory. Я проверил свой код несколько раз, но не нашел никакой проблемы, все кажется правильным.

Кто-нибудь может объяснить мне, в чем проблема и как я могу ее решить?

models.py

from django.db import models
from .managers import TitleManager, CategoryManager

from model_utils.fields import StatusField
from model_utils import Choices


class Node(models.Model):
    name = models.CharField(max_length=70)
    STATUS = Choices("Na bieżąco", "Porzucone", "Wymaksowane", "Planowane", "W trakcie", "Obejrzane")
    status = StatusField(choices_name='STATUS')

    parent = models.ForeignKey(
        'self',
        on_delete=models.CASCADE,
        related_name='children',
        null=True,
        blank=True,
    )

    def __str__(self):
        """Zwraca reprezentację modelu w postaci ciągu tekstowego."""
        return self.name

    class Meta:
        ordering = ('name', 'status',)
        verbose_name_plural = 'Nodes'

class Title(Node):
    """Tytuł utworu."""
    objects = TitleManager()

    class Meta:
        proxy = True
        verbose_name_plural = 'Titles'

class Category(Node):
    """Kategoria utworu."""
    objects = CategoryManager()

    class Meta:
        proxy = True
        verbose_name_plural = 'Categories'


class Subcategory(models.Model):
    """Podkategoria utworu."""
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length = 100)
    STATUS = Choices("Na bieżąco", "Porzucone", "Wymaksowane", "Planowane", "W trakcie", "Obejrzane")
    status = StatusField(choices_name='STATUS')

    def __str__(self):
        """Zwraca reprezentację modelu w postaci ciągu tekstowego."""
        return self.name

manager.py

class TitleManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(parent=None)

class CategoryManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().exclude(parent=None)

forms.py

from django import forms
from .models import Title, Category, Subcategory

class TitleForm(forms.ModelForm):
    class Meta:
        model = Title
        fields = ['name', 'status']
        labels = {
            'name': 'Tytuł',
            'status': 'Status'
        }

class CategoryForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ['name', 'status']
        labels = {
            'name': 'Kategoria',
            'status': 'Status',
        }

views.py

def new_title(request):
    """Dodaj nowy tytuł."""
    if request.method != 'POST':
        # Nie przekazano żadnych danych, należy utworzyć pusty formularz.
        form = TitleForm()

    else:
        # Przekazano dane za pomocą żądania POST, należy je przetworzyć.
        form = TitleForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('jam_app:index')

    # Wyświetlenie pustego formularza.
    context = {
        'form': form,
    }
    return render(request, 'jam_app/new_title.html', context)

def new_category(request, title_id):
    """Dodaj nową kategorię dla danego tytułu."""
    title = Title.objects.get(id=title_id)

    if request.method != "POST":
        # Nie przekazano żadnych danych, należy utworzyć pusty formularz.
        form = CategoryForm()

    else:
        # Przekazano dane za pomocą żądania POST, należy je przetworzyć.
        form = CategoryForm(data=request.POST)
        if form.is_valid():
            new_category = form.save(commit=False)
            new_category.title = title
            new_category.save()
            return redirect('jam_app:details', title_id=title_id)

    # Wyświetlanie pustego formularza.
    context = {
        'title': title,
        'form': form,
    }
    return render(request, 'jam_app/new_category.html', context)

urls.py

    # Dodaj nowy tytuł.
    path('new_title/', views.new_title, name='new_title'),
    # Dodaj nową kategorię.
    path('new_category/<int:title_id>/', views.new_category, 
        name='new_category')

Ссылка на new_category.html

 <p><a href="{% url 'jam_app:new_category' title.id %}">+ Dodaj nową kategorię</a></p>

new_title.html

{% block content %}
  <p>Dodaj nowy tytuł</p>
  
  <form action="{% url 'jam_app:new_title' %}" method='POST'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">Dodaj tytuł</button>
  </form>
{% endblock content %}

new_category.html

{% block content %}
  <p>Dodaj nową kategorię</p>
  <form action="{% url 'jam_app:new_category' title.id %}" method='POST'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name='submit'>Dodaj kategorię</button>
  </form>
{% endblock content %}
Вернуться на верх