【问题标题】:Django url patterns for two related models两个相关模型的 Django url 模式
【发布时间】:2018-04-12 08:58:33
【问题描述】:

我有两个具有一对多关系的模型(学校和学生)。 我的models.py设置如下:

class School(models.Model):
name = models.CharField(max_length=256)
principal = models.CharField(max_length=256)
location = models.CharField(max_length=256)

def __str__(self):
    return self.name

def get_absolute_url(self):
    return reverse("basic_app:school_detail",kwargs={'pk':self.pk})
class Student(models.Model):
name = models.CharField(max_length=256)
age = models.PositiveIntegerField()
school = models.ForeignKey(School,related_name='students',on_delete=models.CASCADE,default=None)

urls.py 文件将包含以下内容:

urlpatterns = [
url(r'^$',views.SchoolListView.as_view(),name='school_list'),
url(r'^(?P<pk>\d+)/$',views.SchoolDetailView.as_view(),name='school_detail'),
url(r'^create/$',views.SchoolCreateView.as_view(),name='school_create'),
url(r'^update/(?P<pk>\d+)/$',views.SchoolUpdateView.as_view(),name='school_update'),
url(r'^delete/(?P<pk>\d+)/$',views.SchoolDeleteView.as_view(),name='school_delete'),

我的问题是我想在 urlpatterns 列表中为学生添加更多 url:类似于

 #url(r'^$',views.StudentListView.as_view(),name='student_list'),
# url(r'^(?P<pk>\d+)/$',views.StudentDetailView.as_view(),name='student_detail'),
# url(r'^create/$',views.StudentCreateView.as_view(),name='student_create'),
# url(r'^update/(?P<pk>\d+)/$',views.StudentUpdateView.as_view(),name='student_update'),
# url(r'^delete/(?P<pk>\d+)/$',views.StudentDeleteView.as_view(),name='student_delete')

我知道我的添加不正确,因为每组学生都应该与特定的学校相关。我很困惑如何在 url 中使用 id/pk,因为例如 student_detail.html url 应该同时包含学校 ID 和学生 ID。 对不起,如果这看起来很幼稚的问题..但我仍在学习,任何帮助将不胜感激.. 谢谢

【问题讨论】:

    标签: django django-models django-urls


    【解决方案1】:

    您可以在 URL 模式中添加另一个参数 school_pk,例如:

    url(r'^school/(?P<school_pk>\d+)/update/(?P<pk>\d+)/$',views.StudentUpdateView.as_view(),name='student_update'),
    

    然后过滤查询集以仅包含该学校的学生。

    class StudentUpdateView(UpdateView):
        def get_queryset(self):
            queryset = super(StudentUpdateView, self).get_queryset()
            return queryset.filter(school=self.kwargs['school_pk'])
    

    UpdateView 将负责获取学生,因为您仍在使用pk 进行学生 pk。

    【讨论】:

    • ...非常感谢...只是为了确认我是否还必须将 school_id 字段添加到学校课程?所以我可以使用school_pk而不是自动生成的id??非常感谢您的回答
    • 您已经拥有school = models.ForeignKey(School, ...),它将每个学生链接到一所学校。在 URL 模式中使用 school_pk 只是一个建议,您可以使用任何您想要的变量名称,只要它在 URL 模式和 get_queryset 方法中匹配即可。
    • 非常感谢您的建议......它对我帮助很大......但我认为我仍然做错了......现在我被困在这里-->>>当我尝试创建一个学生并单击提交时,它会给我一个错误,而不是将我重定向到 student_detail 页面。我收到以下错误:Reverse for 'student_detail' with keyword arguments '{'pk': 7}' not found。尝试了 1 种模式:['basic_app/school/(?P\\d+)/student/(?P\\d+)/$'] 我将我的工作推送到 github:github.com/wesimkhld/school .我将(学生类的)pk重命名为student_pk。我认为我的做法是错误的
    • 现在反向URL时需要提供学校pk和学生pk。
    • 问题是我有两个 pk(在同一个 url 中)(用于学校和学生)。我选择通过 class StudentDetailView(DetailView): context_object_name = 'student_details' model = models.Student template_name = 'basic_app/student_detail.html' def get_context_data(self, **kwargs): context = super(StudentDetailView, self).get_context_data(**kwargs) return context 将学生 pk 重命名为 student_pk,并且 url 将是`url(r'^school/(?P\d+)/student/(?P\d+)/$', views.StudentDetailView.as_view(),name='student_detail'),` 但它不起作用
    【解决方案2】:

    您需要在网址中添加“学生”以使其与众不同。您可能不需要将 school_id 添加到学生网址,因为它们与 ForeignKey 相关

    url(r'^students$',views.StudentListView.as_view(),
        name='student_list'),
    url(r'^student/(?P<pk>\d+)/$',views.StudentDetailView.as_view(),
        name='student_detail'),
    url(r'^student/create/$',views.StudentCreateView.as_view(),
        name='student_create'),
    url(r'^student/update/(?P<pk>\d+)/$',views.StudentUpdateView.as_view(),
        name='student_update'),
    url(r'^student/delete/(?P<pk>\d+)/$',views.StudentDeleteView.as_view(),
        name='student_delete')
    

    【讨论】:

    • ..谢谢.. 但每组学生都应该与特定学校相关联。例如,如果我打开学校 A 页面,我只能看到他们的学生并创建/删除,只更新学校 A 学生。不是网站中的所有学生......再次感谢
    • 是的,您可以将学生列表添加到学校详细信息页面或修改此列表上的第一个 url 以拥有 school_pk 并仅列出该学校下的学生。您仍然不需要其他 4 个网址上的 school_pk。
    • 实际上,如果您想为学校添加新学生而无需在表单中选择学校,您将需要在 StudentCreate url 上添加 school_pk
    猜你喜欢
    • 2013-10-07
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2022-09-27
    • 2012-06-04
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多