当存在多个Django URL时,NoReverseMatch

e7arh2l6  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(135)

我有一个表,上面有一个数据值列表。其中一列包含指向另一页的链接。有时可能有一个链接,有时两个,有时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']

urls.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和链接,但你可以假设它们是正确的。我也试着看看这些解决方案(S):sol1sol2

n6lpvg4x

n6lpvg4x1#

根据您描述的错误,似乎第二个参数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提供的代码仍然没有多大意义。
因为每个data value都有一个links的嵌套列表(可以是空的,也可以是多个值)。如果我没理解错的话。
下面是一种通过使用框架relations来实现这一点的优雅方法:
models.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>

相关问题