【问题标题】:how to make sub pages url in django如何在 django 中制作子页面 url
【发布时间】:2021-03-18 11:13:06
【问题描述】:

在我的在线商店 django 项目中,我想创建一个子页面,显示页面中列出的产品的详细信息。

urls.py 中,我为两个页面创建了如下网址:

path('wwqm', views.water_quality_sensor  , name='wwqm'),
path('wwqm/<str:water_sensor_title>', views.water_sensor_item, name='water_sensor_item'),

在这种情况下,wwqm 中显示了一堆项目。用户点击产品,water_sensor_item 应该会加载。

我知道这不重要,但这里是views.py

def water_quality_sensor(request):

    queryset_list = Water_quality_sensor.objects.order_by('-product_name').filter(is_published=True)

    context = {
                'water_quality_sensor': queryset_list,
            }

    return render(request, 'products/water_quality_sensor.html', context)

def water_sensor_item(request, water_sensor_title):

    water_sensors =  get_object_or_404(Water_quality_sensor, title=water_sensor_title)
    context = {
        'water_sensors': water_sensors
    }
    return render(request, 'products/water_sensor_item.html' , context)

我尝试根据传递给其视图(产品标题)的参数为每个项目构建 url。

在我的模板中,我尝试创建如下链接:

<a href="{% url 'water_sensor_item' w_q_sensor.title %}" class="card hoverable mb-4 text-dark" >

我的一个产品的标题是3725。当我在主页单击该产品时,出现以下错误:

Django Version: 3.1.2  
Exception Type: NoReverseMatch  
Exception Value:     Reverse for 'water_quality_sensor' not found. 'water_quality_sensor' is not a valid view function or pattern name.

我做错了什么?

【问题讨论】:

    标签: python django django-urls django-url-reverse


    【解决方案1】:

    在你的 urls.py 中

    path('wwqm', views.water_quality_sensor  , name='wwqm'),
    

    您使用了名称wwqm。但它看起来像在你的模板中的某个地方(很可能是 water_sensor_item.html),你有类似的东西:

    <a href="{% url 'water_quality_sensor' %}"
    

    将其更改为wwqm 或在urls.py 中更改名称

    更新 最好在您的网址中使用&lt;str:title&gt;&lt;int:pk&gt; ,以避免您在两个产品中使用相同的名称。 pk 是独一无二的。

    在你的urls.py

    path('wwqm/<str:water_sensor_title><int:pk>', views.water_sensor_item, name='water_sensor_item'),          # add <int:pk>
    

    在您的模板中:

    # since url is taking both title and pk arguments, you need to provide both of them. 
    <a href="{% url 'water_sensor_item' title= w_q_sensor.title pk=w_q_sensor.pk %}" class="card hoverable mb-4 text-dark" >
    

    在你看来:

    def water_sensor_item(request, water_sensor_title, pk): # added pk
    
        water_sensors =  get_object_or_404(Water_quality_sensor, pk=pk) # use pk to get the object
        context = {
            'water_sensors': water_sensors
        }
        return render(request, 'products/water_sensor_item.html' , context)
    

    【讨论】:

    • 感谢朋友的指导。这种构建urls 的方式对吗?或者你知道更好的方法吗?
    • 因为每次我在两个不同的类别中有相同名称的产品时,我都会收到该错误,但是当我更改产品名称时,问题就会减少。
    • url 只使用标题是不好的。就像你说的,如果两个名字相同怎么办。更好的方法是 <pk>。由于 pk 是唯一的,即使标题相同,您也将拥有唯一的 url</pk>
    • 我更改了产品名称,但问题仍然存在!它让我发疯了
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2021-10-21
    • 2013-10-19
    相关资源
    最近更新 更多