我试图为django呈现我的通用创建视图,我不能这样做,因为我得到错误"ValueError在/teacher/add/"字段'id'期望得到一个数字,但得到'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']
在捕获add
的TeacherCreateView
之前可能有另一个URL模式,因此将触发不同的视图。例如,这可能看起来像:
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'),
# …
]