我的Django项目“ card”和“ blog”中有两个应用程序
我的项目urls.py是:
urlpatterns = [
path('admin/', admin.site.urls),
path(r'', include(card.urls)),
path('', include('blog.urls')),]
“卡片”应用的url.py是:
urlpatterns = [
re_path(r'^card/$', views.cardindex, name='cardindex'),
re_path(r'^(?P<card_url_var>[-\w.]+)/$', views.carddet, name='carddetail'),]
“卡片”应用的views.py是:
def cardindex(request):
....
def carddet(request, card_url_var):
try:
url_carddetails = carddata.objects.get(page_end_url=card_url_var)
except carddata.DoesNotExist:
raise Http404("Card you are looking for, does not exists")
return render(request, 'card.html', {'url_carddetails':url_carddetails})
“博客”应用程序的urls.py现在是:
urlpatterns = [
re_path(r'^blog/$', views.articleindex, name='articleindex'),
re_path(r'^(?P<art_url_var>[-\w.]+)/$', views.articledet, name='articledetail'),]
用于博客应用程序的viws.py是: def articleindex(request): ....
def articledet(request, art_url_var):
try:
url_articledetails = articledata.objects.get(art_end_url=art_url_var)
except articledata.DoesNotExist:
raise Http404("Article you are looking for, does not exists")
return render(request, 'article.html', {'url_articledetails':url_articledetails})
当我请求“ carddata”模型的“ page_end_url”列中的网址时,代码可以正常工作。但是,当我请求“ articledata”模型的“ art_end_url”列中的网址时,它将返回Http404“您要查找的卡,不存在”。
例如: 如果我请求example.com/new-year-card-2018 该代码可以正常工作,因为“ page_end_url”列中存在“ new-year-card-2018”。
但是如果我请求example.com/best-designs-of-2018 网址“ / best-design-of-2018” whis被保存为“ articledata”模型的“ art_end_url”属性。代码返回Http404“您要查找的卡,不存在”
因此,请告诉我,如果请求的网址(例如“ card_url_var”与“ page_end_url”不匹配),是否可以通过“ card” views.py文件退出carddet函数。 我是django的新手。 任何的意见都将会有帮助。在此先感谢
答案 0 :(得分:3)
您的请求不断调用您网址格式中的第一个网址匹配项。
实际上,这两个URL几乎相同:
re_path(r'^(?P<card_url_var>[-\w.]+)/$', views.carddet, name='carddetail'),]
re_path(r'^(?P<art_url_var>[-\w.]+)/$', views.articledet, name='articledetail'),]
这个(?P<card_url_var>[-\w.]+)
正在等待一个ug弹:/slug-slug/
还有这个(?P<art_url_var>[-\w.]+)
:/slug-slug/
。
因此,Django将查找第一个匹配的URL,显然第一个将匹配。您可以做的是在每项中添加不同的内容,例如:
re_path(r'^card/(?P<card_url_var>[-\w.]+)/$', views.carddet, name='carddetail'),]
re_path(r'^article/(?P<art_url_var>[-\w.]+)/$', views.articledet, name='articledetail'),]
答案 1 :(得分:1)
您可以通过这种方式尝试。
from django.core.urlresolvers import reverse
try:
...
except:
return redirect(reverse('name-of-url'))
更多详细信息here