当存在多个时,Django URL 上没有ReverseMatch

问题描述 投票:0回答:1

我有一个表格,上面有数据值列表。其中一列包含指向另一页面的链接。有时可能有一个链接,有时可能有两个,有时可能有 n 个。

当只有一个链接时,代码按预期工作,模式匹配并转到预期页面。每当存在多个链接时,就会失败。它仍然会正确构建 url,我可以在浏览器的搜索栏中看到完整正确的 url,但我收到 NoReverseMatch 错误。

错误:

Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'thelink' with arguments '('64f75fake8012b456073fake', '')' not found. 1 pattern(s) tried: ['thelink/(?P<table>[^/]+)/(?P<row>[^/]+)\\Z']

url.py

path('thelink/<str:table>/<str:row>', views.thelink, name='thelink'),

html 工作和中断的地方:

<td>
    {% for table, row in data %}
    <a href="{% url 'thelink' table row %}" type="button" class="badge badge-info">
        link
    </a>&nbsp;
    {% endfor %}
</td>

从 html 代码生成 HTML:

工作:

<a href="/thelink/64f75fake8012b456073fake/64f75be82fakeb456073fake" type="button" class="badge badge-info">link</a>

不工作:

<a href="/thelink/64f75fake8012b456073fake/64f75be82fakeb45603fake1" type="button" class="badge badge-info">link</a>
<a href="/thelink/64f75fake8012b456073fake/64f75be82fakeb45603fake2" type="button" class="badge badge-info">link</a>
<a href="/thelink/64f75fake8012b456073fake/64f75be82fakeb45603fake3" type="button" class="badge badge-info">link</a>

注意:我确实更改了 ID 和链接,但您可以假设它们是正确的。我也尝试过查看这些解决方案:sol1sol2

html python-3.x django django-urls
1个回答
0
投票

根据您描述的错误,似乎第二个参数

row
不存在。这意味着您的数据中存在
None
''
(缺失)值。本质上,它在尝试渲染时中断:

<a href="{% url 'thelink' table '' %}" type="button" class="badge badge-info">
    link
</a>&nbsp;

所以,我想你可以在尝试反向解决不存在的问题之前

if check

<td>
    {% for table, row in data %}
        {% if row %}
            <a href="{% url 'thelink' table row %}" type="button" class="badge badge-info">
                link
            </a>&nbsp;
        {% else %}
            <p>No links here.</p>
        {% endif %}
    {% endfor %}
</td>

另一种方式

由于您没有共享任何模型或视图,我不知道您如何存储或访问这些数据。无论如何,这对于您为

template
提供的代码仍然没有多大意义。

因为每个

links
都会有一个
data value
的嵌套列表(空或有多个值)。如果我理解正确的话。

这是一种利用框架relations来实现这一点的优雅方法:

模型.py

class SomeTable(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)


class RelatedLink(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    some_table = models.ForeignKey(
        SomeTable, 
        related_name='links', 
        on_delete=models.CASCADE
    )

views.py

def index(request):
    data_values = SomeTable.objects.prefetch_related("links")
    return render(request, "index.html", {"data_values": data_values})

index.html

<table>
    <tr>
        <th>Table</th>
        <th>Links</th>
    </tr>
    {% for table in data_values %}
    <tr>
        <td>{{table.id}}</td>
        {% if not table.links.all %}
        <td>
            No links here.
        </td>
        {% else %}
        <td>
            {% for link in table.links.all %}
                <a href="{% url 'thelink' table.id link.id %}" type="button" class="badge badge-info">
                    {{link.id}}
                </a>
            <br>
            {% endfor %}
        </td>
        {% endif %}
    </tr>
    {% endfor %}
</table>
© www.soinside.com 2019 - 2024. All rights reserved.