Django URL conf conf重定向到错误的视图

Chr*_*Yin 1 python django url

为大学生写一个应用程序 - 显示一个部门列表,你点击一个,然后它会显示该部门的课程,点击一个,然后显示教授该课程的教授.

遇到网址问题 - 我的应用程序会将我重定向到错误的视图.

所以我有3个型号

class Department(models.Model):
    subject         = models.CharField(max_length = 25)
    pub_date        = models.DateTimeField(auto_now_add = True)

    def __unicode__(self):
        return self.subject

class Course(models.Model):
    department      = models.ForeignKey(Department)
    course_number   = models.CharField(max_length = 50)
    course_name     = models.CharField(max_length = 100, blank = True, null = True)
    c_pub_date      = models.DateTimeField(auto_now_add = True)

    def __unicode__(self):
        return self.course_number

class Professor(models.Model):
    course          = models.ForeignKey(Course)
    prof_name       = models.CharField(max_length = 50)
    p_pub_date      = models.DateTimeField(auto_now_add = True)

    def __unicode__(self):
        return self.prof_name
Run Code Online (Sandbox Code Playgroud)

然后我的应用程序URL conf将转到视图,课程和教授,具体取决于URL

urlpatterns = patterns('qanda.views',
    url(r'^$', 'index'),
    url(r'(?P<department_id>\d+)/$', 'courses'),
    url(r'(?P<department_id>\d+)/(?P<course_id>\d+)/$', 'professors'),
)
Run Code Online (Sandbox Code Playgroud)

因此,当我访问url mysite.com时,它会列出数据库中的所有部门.然后单击一个部门(即数学),它将带我到mysite.com/1的课程视图,它会显示该部门的所有课程.然后点击一个课程应该带我去教授视图mysite.com/1/1,它向我展示了教授该课程的所有教授.

但是,当我进入课程视图并单击课程以获得教授视图时,即使URL显示为mysite.com/1/2,它实际上会将我重定向回mysite.com/2,并使用course_id(在这种情况,2)并将其误认为departmment_id,并将我重定向到课程视图.

例如,Math 101 course_id = 1.数学102 course_id = 2.对于数学101,有2位教授.教授A教授_id = 1,教授B教授_id = 2.

因此,当点击Math 101时,URL将是mysite.com/1.点击B教授之后,URL将是mysite.com/1/2.然而,现在当点击教授B时,URl会显示mysite.com/1/2,但会将我带到mysite.com/2.

知道为什么会这样吗?

Yuj*_*ita 5

你的问题是你的正则表达式太模糊了......你错过了^所以你的第一个网址是匹配的,然后你的第二个网页才有机会.

(\d+)/$ 会匹配 /3/, foo/3/, foo/bar/baz/3

它与尾部斜杠无关.这是一个标准的Django URL模式./$

url(r'^$', 'index'),
url(r'(?P<department_id>\d+)/$', 'courses'),
#   ^^^ needs ^
url(r'(?P<department_id>\d+)/(?P<course_id>\d+)/$', 'professors'),
Run Code Online (Sandbox Code Playgroud)