关于Python Django框架中URL不匹配的问题如何解决?

请问这个错误是哪里出了问题?

这是我的 url

urlpatterns = [
        #post views
        url(r'^$', views.post_list, name='post_list'),
        url(r'^(P?<year>\d{4})/(P?<month>\d{2})/(P?<day>\d{2})/(?P<post>[-\w]+)/$', views.post_detail, name='post_detail'),
]

models

[@python_2_unicode_compatible](/user/python_2_unicode_compatible)
class Post(models.Model):
    STATUS_CHOICES = (
            ('draft', '草稿'),
            ('published', '发布')
            )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    update = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES,default='draft', verbose_name='状态')
    objects = models.Manager()
    published = PublishedManager()
class Meta:
    ordering = ('-publish',)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('blog:post_detail', args=[self.publish.year,
                                             self.publish.strftime('%m'),
                                             self.publish.strftime('%d'),
                                             self.slug])

错误信息是

NoReverseMatch at /blog/

Reverse for ‘post_detail’ with arguments ‘(2017, ‘04’, ‘04’, ‘test1’)’ and keyword arguments ‘{}’ not found. 1 pattern(s) tried: [‘blog/(P?<year>\d{4})/(P?<month>\d{2})/(P?<day>\d{2})/(?P<post>[-\w]+)/$’]

Request Method: GET Request URL: http://127.0.0.1:8000/blog/ Django Version: 1.10.6 Exception Type: NoReverseMatch Exception Value:

Reverse for ‘post_detail’ with arguments ‘(2017, ‘04’, ‘04’, ‘test1’)’ and keyword arguments ‘{}’ not found. 1 pattern(s) tried: [‘blog/(P?<year>\d{4})/(P?<month>\d{2})/(P?<day>\d{2})/(?P<post>[-\w]+)/$’]

Exception Location: /usr/local/lib/python3.6/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 392 Python Executable: /usr/local/opt/python3/bin/python3.6 Python Version: 3.6.1 Python Path:

[’/Users/Licht/Code/Python/Django_by_Example/mysite’, ‘/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python36.zip’, ‘/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6’, ‘/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload’, ‘/usr/local/lib/python3.6/site-packages’]

Server time: 星期二, 4 四月 2017 16:08:35 +0800

我是照着 django by example 的代码写的为什么会有问题呢?


关于Python Django框架中URL不匹配的问题如何解决?

3 回复

在Django里URL不匹配,多半是urls.py配置或者视图函数返回的路径有问题。核心就两点:检查路由配置和确保反向解析正确。

最常见的情况是你的URL模式写错了,或者视图里用reverse(){% url %}标签时传的参数不对。比如你定义了一个带参数的路径,但调用时没给够参数。

1. 先检查项目根urls.py和应用的urls.py 确保应用的路由被正确包含,且模式匹配你访问的URL。比如:

# project/urls.py
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),  # 确保这里包含了你的应用
]

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('article/<int:article_id>/', views.article_detail, name='article_detail'),
]

访问/myapp/article/5/时,<int:article_id>会捕获数字5并传给视图。

2. 重点检查reverse(){% url %}的使用 这是最容易出错的地方。你必须提供与URL模式匹配的参数。

# 在视图里
from django.urls import reverse

# 正确:提供参数article_id
url = reverse('article_detail', kwargs={'article_id': 5})

# 错误:没提供参数,会抛NoReverseMatch
url = reverse('article_detail')

模板里也一样:

<!-- 正确 -->
<a href="{% url 'article_detail' article_id=article.id %}">Link</a>

<!-- 错误:参数名或数量不匹配 -->
<a href="{% url 'article_detail' id=article.id %}">Link</a>

3. 用Django的调试工具 如果还是不行,打开settings.py确保DEBUG = True,然后访问出错的URL。Django的404页面会列出所有尝试过的URL模式,你能直接看到为什么没匹配上。

4. 检查视图返回的redirect 如果你在视图里用redirect('some_name'),同样要确保参数传递正确。

总结一下:对着urls.py里的模式,仔细核对你调用reverse{% url %}时传的参数,一个都不能少,名字必须完全一致。

建议:用命名的URL模式并仔细核对参数。


正则表达式应该是?P&lt;name&gt;

对,我去吃了个饭回来就看到了,不知道为什么当时跟瞎了一样死活找不到

回到顶部