如果在数据库中找不到查询集,如何退出视图功能

时间:2018-07-02 05:12:30

标签: python regex django

我的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的新手。 任何的意见都将会有帮助。在此先感谢

2 个答案:

答案 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