Python Django在给定url上调用了错误的函数

Python Django在给定url上调用了错误的函数,python,django,Python,Django,django调用“listing”函数,即使我告诉它在处理转到…/watchlist url时产生的请求时使用“watchlist”函数。我找不到问题。 以下是错误: File "/home/simon/Dokumente/cs50WebProgramming/commerce/auctions/views.py", line 103, in listing listing_obj = AuctionListing.objects.get(id=int(listi

django调用“listing”函数,即使我告诉它在处理转到…/watchlist url时产生的请求时使用“watchlist”函数。我找不到问题。 以下是错误:

  File "/home/simon/Dokumente/cs50WebProgramming/commerce/auctions/views.py", line 103, in listing
    listing_obj = AuctionListing.objects.get(id=int(listing_id))
ValueError: invalid literal for int() with base 10: 'watchlist'
url.py

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create", views.create_listing, name="create"),
    path("after_create", views.after_create, name="after_create"),
    path("<str:listing_id>", views.listing, name="listing"),
    path("<str:listing_id>/bid", views.after_bid, name="after_bid"),
    path("watchlist", views.watchlist, name="watchlist")
]
def listing(request, listing_id):
    listing_obj = AuctionListing.objects.get(id=int(listing_id))

    return render(request, "auctions/listing.html", {
        "listing": listing_obj
    })

def watchlist(request):
    return render(request, "auctions/watchlist.html")

问题在于URL路径的顺序。在
监视列表
之前有
,它会导致任何字符串路径与
匹配。只需重新安排您的路径,您就可以:

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create", views.create_listing, name="create"),
    path("after_create", views.after_create, name="after_create"),
    path("watchlist", views.watchlist, name="watchlist")
    path("<str:listing_id>/bid", views.after_bid, name="after_bid"),
    path("<str:listing_id>", views.listing, name="listing"),
]
urlpatterns=[
路径(“,views.index,name=“index”),
路径(“login”,views.login\u view,name=“login”),
路径(“注销”,views.logout\u view,name=“logout”),
路径(“register”,views.register,name=“register”),
路径(“创建”,views.create\u列表,name=“创建”),
路径(“创建后”,views.after\u create,name=“创建后”),
路径(“watchlist”,views.watchlist,name=“watchlist”)
路径(“/bid”,views.after\u bid,name=“after\u bid”),
路径(“,views.listing,name=“listing”),
]
这是因为
匹配任何字符串,包括
监视列表
,并且由于首先定义了
监视列表
,它将触发
列表
视图。您可以更改顺序,但也可以将路径限制为仅接受整数:

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('register/', views.register, name='register'),
    path('create/', views.create_listing, name='create'),
    path('after_create/', views.after_create, name='after_create'),
    path('watchlist/', views.watchlist, name='watchlist'),
    path('<int:listing_id>/', views.listing, name='listing'),
    path('<int:listing_id>/bid/', views.after_bid, name='after_bid')
]

注意:使用, 然后直接使用。如果对象不存在, 例如,由于用户自己更改了URL,
get\u object\u或_404(…)
将返回HTTP 404 Not Found响应,而使用
.get(…)
将导致HTTP 500服务器错误


此外,请查看Willem Van Onsem的答案,他指出了一些有用的更改/优化。
from django.shortcuts import get_object_or_404

def listing(request, listing_id):
    listing_obj = get_object_or_404(AuctionListing, id=listing_id)

    return render(request, "auctions/listing.html", {
        "listing": listing_obj
    })