关于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不匹配的问题如何解决?
在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<name>吧
对,我去吃了个饭回来就看到了,不知道为什么当时跟瞎了一样死活找不到

