Получение ValueError при создании моего Django CreateView

Я пытаюсь вывести свое общее представление create для django и не могу этого сделать, так как получаю ошибку "ValueError at /teacher/add/" "Field 'id' expected a number but got 'add'." Я не уверен, в чем здесь может быть проблема.

models.py

    from django.db import models
from django.urls import reverse

# Create your models here.


DEPARTMENT_CHOICES = [
    ('Social Studies', 'Social Studies'),
    ('Math', 'Math'),
    ('Science', 'Science'),
]


class Department(models.Model):
    name = models.CharField(choices=DEPARTMENT_CHOICES, max_length=300)

    def __str__(self):
        return self.name


class Teacher(models.Model):
    name = models.CharField(max_length=300)
    # delete dept == delete teacher
    department = models.ForeignKey(Department, on_delete=models.CASCADE)
    tenure = models.BooleanField()

    def __str__(self):
        return f'{self.name} teaches {self.department}'

    # dont need success url if get_absolute_url on create and update view

    def get_absolute_url(self):
        return reverse('teacher-detail', kwargs={'pk': self.pk})

urls.py

urlpatterns = [
    path('teacher/add/', TeacherCreateView.as_view(), name='teacher-add'),
]

views.py

class TeacherCreateView(CreateView):
    model = Teacher
    fields = ['name']

Скорее всего, у вас есть другой шаблон URL перед шаблоном TeacherCreateView, который захватывает add, и, таким образом, запускает другое представление. Например, это может выглядеть так:

urlpatterns = [
    path('teacher/<pk>/', TeacherDetailView.as_view(), name='teacher'),
    # …,
    path('teacher/add/', TeacherCreateView.as_view(), name='teacher-add'),
    # …
]

в результате <pk> перехватит add и вместо него запустит DetailView. Вам следует сделать pk более ограничительным и работать с преобразователем пути <int:…>:

urlpatterns = [
    path('teacher/<int:pk>/', TeacherDetailView.as_view(), name='teacher'),
    # …
    path('teacher/add/', TeacherCreateView.as_view(), name='teacher-add'),
    # …
]
Вернуться на верх