Django добавляет дополнительный "/" в url?

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/products/1//
Using the URLconf defined in products.urls, Django tried these URL patterns, in this order:

[name='home']
contact/
admin/
products/ [name='product-list']
products/
products/ <int:id>/ [name='product-detail']
products/ <int:id>/delete/ [name='product-delete']
products/
about/
The current path, products/1//, didn’t match any of these

Почему он требует дополнительный слэш после id? Чем больше я с ним работаю, тем больше слэшей он требует. У меня urls.py выглядит так:

from django.urls import path
from .views import (
    product_detail_view,
    product_create_view,
    render_initial_data,
    dynamic_lookup_view,
    product_delete_view,
    product_list_view)

app_name = 'product'
urlpatterns = [
    path('', product_list_view, name='product-list'),
    path('', product_create_view),
    path('<int:id>/', dynamic_lookup_view, name='product-detail'),
    path('<int:id>/delete/', product_delete_view, name='product-delete'),
    path('', product_detail_view),
]

А также еще один urls.py с чем-то вроде этого:

urlpatterns = [
    path('', home_view, name='home'),
    path('contact/', contact_view),
    path('admin/', admin.site.urls),
    path('products/', include('product.urls')),
    path('about/', about_view),
]

Вот функция:

def dynamic_lookup_view(request, id):
    #obj = Product.objects.get(id=id)
    #obj = get_object_or_404(Product, id=id)
    try:
        obj = Product.objects.get(id=id)
    except Product.DoesNotExist:
        raise Http404
    context = {
        'object': obj
    }
    return render(request, "products/product_detail.html", context)

Так, он вызывает исключение, потому что ищет дополнительный "/", но откуда он взялся?

Похоже, что лишняя косая черта появилась из-за того, как вы отображаете ссылку в своем шаблоне

<a href="{{ instance.get_absolute_url }}/">{{ instance.title }}</a>

Вы можете попробовать убрать лишнюю косую черту

<a href="{{ instance.get_absolute_url }}">{{ instance.title }}</a>

Вот как это делается в docs

<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

Вы можете добавить APPEND_SLASH = TRUE/FALSE в ваш settings.py в соответствии с вашими требованиями. Если установлено значение True, если URL запроса не соответствует ни одному из шаблонов, указанных вами в вашем urls.py, он добавляет слеш и делает повторный запрос к тому же URL с добавленным слешем.

Вернуться на верх