【问题标题】:templates won't work after adding migrations添加迁移后模板将不起作用
【发布时间】:2019-03-24 14:42:01
【问题描述】:

我通过迁移添加了数据,现在在运行 migratemakemigrations 之后 我尝试runserver 并且到处都有 NoReverseMatch 错误。

看看这个错误:

NoReverseMatch at /blog/

Reverse for 'blog_post_detail' with keyword
arguments '{'year': 2008, 'month': 9, 'slug': 'django-10-released'}'
not found. 1 pattern(s) tried:
['(?P<year>\\d{4}/)^(?P<month>\\d{1,2}/)^(?P<slug>\\w+)/$']

在迁移中它看起来像这样:

POSTS = [
    {
        "title": "Django 1.0 Release",
        "slug": "django-10-released",
        "pub_date": date(2008, 9, 3),
        "startups": [],
        "tags": ["django", "python", "web"],
        "text": "THE Web Framework.",
    },]

这是实际的 urlpattern:

    re_path (r'^(?P<year>\d{4}/)'
        r'^(?P<month>\d{1,2}/)'
        r'^(?P<slug>\w+)/$',post_detail,name='blog_post_detail'),

同样,每个模板都有同样的问题......

【问题讨论】:

  • 请不要使用&gt; 来缩进代码或错误消息。它隐藏了尖括号,因此它显示['(?P\d{4}/)^(?P\d{1,2}/)^(?P\w+)/$'] 而不是['(?P&lt;year&gt;\\d{4}/)^(?P&lt;month&gt;\\d{1,2}/)^(?P&lt;slug&gt;\\w+)/$']

标签: python django python-3.x django-templates django-migrations


【解决方案1】:

^ 匹配字符串的开头,所以你不应该将它包含在正则表达式的中间。从monthslug 字符串中删除它。您还应该将正斜杠移到命名组之外。如果您的 slug 包含连字符,那么您需要使用 [\w-]+ 而不是 \w+

re_path (r'^(?P<year>\d{4})/'
    r'(?P<month>\d{1,2})/'
    r'(?P<slug>[\w-]+)/$',post_detail,name='blog_post_detail'),

就我个人而言,当它被分成多行时,我发现这个正则表达式更难。我更喜欢:

re_path (r'^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<slug>[\w-]+)/$',
         post_detail,name='blog_post_detail'),

【讨论】:

  • 我不明白你的评论。我的回答可能无法解决你的问题,但至少会给你一个不同的错误信息。除非我知道您正在运行的代码和您收到的错误消息,否则我无能为力。
  • 您问题中的代码在错误的地方仍然有^s 和/s。如果您使用我的答案,那么您可能仍然会得到NoReversematch,但确切的错误消息文本会有所不同。我无能为力,因为我不知道确切的代码和错误消息。
  • flush 从数据库中删除所有数据。如果您的数据库中没有任何项目,则反转 URL 的代码不会运行,因此您不会收到错误消息。正如文档所建议的那样,您可能希望删除数据库并运行 migrate,这将重新运行所有迁移。
  • 没有删除数据库的 Django 命令。如果您使用的是SQLite,您可以删除db.sqlite3 文件。
  • 我注意到正则表达式中的另一个问题 - 它不处理 slug 中的连字符。请参阅上面的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2013-11-26
  • 2018-06-08
  • 2017-07-24
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多