Django Url没有找到模型

时间:2013-12-14 03:43:38

标签: python django model urlconf

我的urlconf出了问题。尝试访问页面时出现以下错误: NoReverseMatch at / admin / r / 17/1 /

使用参数'()'和关键字参数'{'slug':u'yummy-cake'}'找不到“奖励”。尝试了1种模式:['prizes /(?P)/ $']

如果我手动输入网址,我会找不到网页。

我的网址:

....
url(r'^prizes/$', PrizeList.as_view(), name="prize_list"),
url(r'^prizes/(?P<slug>\w+)/$', GetPrize.as_view(), name="prize"),
....

我的模特:

class Prize(models.Model):
    prize_name = models.CharField(max_length=30, blank=False, null=False, verbose_name="the prize's name")
    prize_slug = models.SlugField(max_length=30, blank=False, null=False, verbose_name="the prize slug")
    prize_excerpt = models.CharField(max_length=100, blank=False, null=False, verbose_name="prize excerpt")
    company = models.ForeignKey('Company')
    prize_type = models.ManyToManyField('Prize_Type')
    def get_absolute_url(self):
        return reverse('omni:reward', kwargs={'slug':self.prize_slug})
    def __str__(self):
        return self.prize_name

最后,模板的一些相关部分:

class GetPrize(SingleObjectMixin, FormView):
    template_name = 'omninectar/prize.html'
    slug_field = 'prize_slug'
    form_class = Redeem_Form
    model = Prize

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

两件事:

  1. Reverse for 'reward' with arguments '()' and keyword arguments '{'slug': u'yummy-cake'}' not found→在你的get_absolute_url方法中,你告诉Django寻找一个名为reward的url模式,它不在你的urlconf中。将其更改为prize,它应该有效。

  2. “如果我手动输入网址,则会找不到网页”→您的模式为\w+documentation中描述为

  3.   

    如果未指定LOCALE和UNICODE标志,则匹配any   字母数字字符和下划线;这相当于   设置 [a-zA-Z0-9 _] 。使用LOCALE,它将匹配设置[0-9_]加上   任何字符都被定义为当前的字母数字   语言环境。如果设置了UNICODE,则将匹配字符[0-9_] plus   在Unicode字符中被分类为字母数字的任何内容   属性数据库。

    所以它只匹配字母,数字和下划线。它与'yummy-cake'中的' - '不匹配。你可以在python shell中试试这个:

        import re
        pat = re.compile(r'^prizes/(?P<slug>\w+)/$')
        pat.match("prizes/yummy-cake/")  # no match returned
        pat.match("prizes/yummycake/")  # → <_sre.SRE_Match object at 0x7f852c3244e0>
        pat = re.compile(r'^prizes/(?P<slug>[-\w]+)/$')  # lets fix the pattern
        pat.match("prizes/yummy-cake/")  # now it works → <_sre.SRE_Match object at 0x7f852c3244e0>