【问题标题】:Django Url Not Finding ModelDjango Url 找不到模型
【发布时间】:2014-01-01 23:39:12
【问题描述】:

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

没有找到带有参数“()”和关键字参数“{'slug': u'yummy-cake'}' 的'reward' 的反向操作。尝试了 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

有什么想法吗?

【问题讨论】:

    标签: python django model urlconf


    【解决方案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. “如果我手动输入 url,我会找不到页面”→ 您的模式是 \w+,在 documentation 中描述为

    当没有指定 LOCALE 和 UNICODE 标志时,匹配任何 字母数字字符和下划线;这相当于 设置 [a-zA-Z0-9_]。使用 LOCALE,它将匹配集合 [0-9_] 加上 任何字符被定义为当前的字母数字 语言环境。如果设置了 UNICODE,这将匹配字符 [0-9_] 加 在 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>
    

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 2019-08-21
      • 2017-01-18
      • 2013-08-23
      • 2011-10-05
      相关资源
      最近更新 更多