求一对多关联的School与Student模型的Django URL配置
搞定School和Student模型的Django URL配置
首先得先把你的Student模型里的外键关联补全,不然一对多关系没法正常工作,补全后的Student模型代码如下:
class Student(models.Model): name = models.CharField(max_length=256) age = models.PositiveIntegerField() # 补全外键关联,related_name方便从学校反向获取学生列表 school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='students') def __str__(self): return self.name def get_absolute_url(self): return reverse("basic_app:student_detail", kwargs={'pk': self.pk})
接下来分项目根URL配置和应用(basic_app)URL配置两部分来设置:
1. 项目根目录的urls.py
需要把basic_app的路由包含进来,并且设置应用命名空间(和你模型里get_absolute_url用的basic_app:对应):
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 把basic_app的路由挂载到/basic_app/路径下,指定命名空间 path('basic_app/', include('basic_app.urls', namespace='basic_app')), ]
2. basic_app目录下的urls.py
这里需要配置学校列表、学校详情、学生详情这些核心页面的路由,假设你用Django自带的基于类的视图(ListView、DetailView)来实现视图逻辑:
from django.urls import path from . import views urlpatterns = [ # 学校列表页:访问路径为/basic_app/schools/ path('schools/', views.SchoolListView.as_view(), name='school_list'), # 学校详情页:对应模型里get_absolute_url的school_detail,接收主键pk参数 path('schools/<int:pk>/', views.SchoolDetailView.as_view(), name='school_detail'), # 学生详情页:单独查看学生信息的页面 path('students/<int:pk>/', views.StudentDetailView.as_view(), name='student_detail'), ]
补充:对应的视图示例(basic_app/views.py)
为了让URL能正常工作,你需要在视图里定义这些基于类的视图:
from django.views.generic import ListView, DetailView from .models import School, Student class SchoolListView(ListView): model = School # 模板默认会使用school_list.html,可通过template_name自定义模板路径 class SchoolDetailView(DetailView): model = School # 模板默认会使用school_detail.html,在模板里可通过{{ object.students.all }}获取该学校的所有学生 class StudentDetailView(DetailView): model = Student
这样配置后,你模型里的get_absolute_url就能正常跳转学校详情页,学生的详情页也能通过对应URL访问啦。
内容的提问来源于stack exchange,提问作者WISAM
相关产品推荐
相关产品推荐

