Почему моя форма 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 %}