【问题标题】:Django URL conf conf redirecting to wrong viewDjango URL conf conf重定向到错误的视图
【发布时间】:2012-11-25 09:02:35
【问题描述】:

为大学生编写应用程序 - 显示一个系列表,单击一个,然后显示该系的课程,单击一个,然后显示教授该课程的教授。

URL conf 有问题 - 我的应用不断将我重定向到错误的视图。

所以我有 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

然后我的应用 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'),
)

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

但是,当我进入课程视图并单击课程以进入教授视图时,即使 URL 显示 mysite.com/1/2,它实际上会将我重定向回 mysite.com/2,将course_id(在本例中为 2)并将其误认为是部门 ID,并将我重定向到课程视图。

例如,Math 101 course_id = 1。Math 102 course_id = 2。对于 Math 101,有 2 位教授。 A教授professor_id = 1,B教授professor_id = 2。

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

知道为什么会这样吗?

【问题讨论】:

  • 你能给出视图代码而不是模型代码吗?

标签: python django url


【解决方案1】:

你的问题是你的正则表达式太模糊了。你错过了 ^ 所以你的第一个 URL 在你的第二个有机会之前匹配。

(\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'),

【讨论】:

  • 哦。不敢相信我错过了。谢谢!
  • 实际上斜线可能很重要,但 django 可能会容忍您的错误,具体取决于您的设置(请参阅docs.djangoproject.com/en/dev/ref/settings/#append-slash
  • @simon,不 - 如果 APPEND_SLASH 被关闭并且斜线变得相关,你会得到 404,而不是其他视图。
【解决方案2】:

看起来您有两个问题 - 缺少插入符号和尾部斜杠。试试这个:

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'),
)

【讨论】:

  • 仍然无法正常工作。我已经设置了部门>课程>教授。现在它正在列出部门——单击一个部门会将我带到该部门的课程列表。但是,单击课程只会将我带到与课程具有相同 ID 的另一个部门。
  • 对不起,正则表达式不太正确——我已经编辑了答案,你能再试一次吗?
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2011-07-16
  • 2018-01-14
  • 2020-08-23
  • 2011-11-13
  • 2012-12-04
相关资源
最近更新 更多