Django:找不到带有参数“(3,”)的“ topic_posts”的反向
Django: Reverse for ‘topic_posts’ with arguments ‘(3, ”)’ not found
''topic_posts' 的反向在其他地方工作正常。但它在这里不起作用。
HTML 文件
<td class="align-middle">
{% with post=board.get_last_post %}
<small>
<a href="{% url 'topic_posts' board.id post.topic.id %}">
By {{ post.created_by.username }} at {{ post.created_at }}
id - {{ board.id }} {{ post.topic.id }}
</a>
</small>
{% endwith %}
</td>
url设置
path('boards/<int:board_id>/topics/<int:topic_id>/', views.topic_posts, name='topic_posts'),
topic = get_object_or_404(Topic, board_id=board_id, id=topic_id)
return render(request, 'topic_posts.html', {'topic': topic})
当我将 board.id
和 post.topic.id
更改为整数值时,例如 1 和 24,网络将呈现。我评论了<a href="{% url 'topic_posts' board.id post.topic.id %}">
并添加了{{ board.id }} {{ post.topic.id }}
,看看查询有没有错误,结果没有问题,它会在网页上呈现1、24。然后我试了一下 <a href="{% url 'topic_posts' board.id 24 %}">
可以,但是 <a href="{% url 'topic_posts' board.id post.topic.id %}">
还是不行。
class Board(models.Model):
name = models.CharField(max_length=30, unique=True)
description = models.CharField(max_length=100)
def __str__(self):
return self.name
def get_posts_count(self):
return Post.objects.filter(topic__board=self).count()
def get_last_post(self):
return Post.objects.filter(topic__board=self).order_by('-created_at').first()
感谢阅读!
您的 template/HTML 代码中有一个循环。它适用于 1
和 24
的原因是因为这是循环的第一次迭代,而你的函数 get_last_post
returns 最新的 post for a board
与 1
的 id
。但是当 for 循环找到 id
为 3
的 board
时,不存在最新的 post 并且返回 None
或为空。这就是您收到此错误的原因。错误本质上是说,我找不到只有 board_id=3
和空 post_id
.
的 URL
您可以通过打印来确认:
print(Post.objects.filter(topic__board_id=3).order_by('-created_at').first())
或者通过检查您的数据库,在 id
为 3
的棋盘上找到任何 post。
您可以通过显示 link 仅 来解决此问题,如果存在具有最新 post 的板,例如:
{% if post.topic.id %}
<a href="{% url 'topic_posts' board.id post.topic.id %}">
By {{ post.created_by.username }} at {{ post.created_at }} id - {{ board.id }} {{ post.topic.id }}
</a>
{% endif %}
<a href="{% url 'topic_posts' board.id post.topic.id %}">
Django无法理解这里的board和post。
尝试在 return render
期间将其与模板一起通过上下文发送
试试这个:
return render(request, 'topic_posts.html', {'topic': topic, 'board': board, 'post': post})
''topic_posts' 的反向在其他地方工作正常。但它在这里不起作用。 HTML 文件
<td class="align-middle">
{% with post=board.get_last_post %}
<small>
<a href="{% url 'topic_posts' board.id post.topic.id %}">
By {{ post.created_by.username }} at {{ post.created_at }}
id - {{ board.id }} {{ post.topic.id }}
</a>
</small>
{% endwith %}
</td>
url设置
path('boards/<int:board_id>/topics/<int:topic_id>/', views.topic_posts, name='topic_posts'),
topic = get_object_or_404(Topic, board_id=board_id, id=topic_id)
return render(request, 'topic_posts.html', {'topic': topic})
当我将 board.id
和 post.topic.id
更改为整数值时,例如 1 和 24,网络将呈现。我评论了<a href="{% url 'topic_posts' board.id post.topic.id %}">
并添加了{{ board.id }} {{ post.topic.id }}
,看看查询有没有错误,结果没有问题,它会在网页上呈现1、24。然后我试了一下 <a href="{% url 'topic_posts' board.id 24 %}">
可以,但是 <a href="{% url 'topic_posts' board.id post.topic.id %}">
还是不行。
class Board(models.Model):
name = models.CharField(max_length=30, unique=True)
description = models.CharField(max_length=100)
def __str__(self):
return self.name
def get_posts_count(self):
return Post.objects.filter(topic__board=self).count()
def get_last_post(self):
return Post.objects.filter(topic__board=self).order_by('-created_at').first()
感谢阅读!
您的 template/HTML 代码中有一个循环。它适用于 1
和 24
的原因是因为这是循环的第一次迭代,而你的函数 get_last_post
returns 最新的 post for a board
与 1
的 id
。但是当 for 循环找到 id
为 3
的 board
时,不存在最新的 post 并且返回 None
或为空。这就是您收到此错误的原因。错误本质上是说,我找不到只有 board_id=3
和空 post_id
.
您可以通过打印来确认:
print(Post.objects.filter(topic__board_id=3).order_by('-created_at').first())
或者通过检查您的数据库,在 id
为 3
的棋盘上找到任何 post。
您可以通过显示 link 仅 来解决此问题,如果存在具有最新 post 的板,例如:
{% if post.topic.id %}
<a href="{% url 'topic_posts' board.id post.topic.id %}">
By {{ post.created_by.username }} at {{ post.created_at }} id - {{ board.id }} {{ post.topic.id }}
</a>
{% endif %}
<a href="{% url 'topic_posts' board.id post.topic.id %}">
Django无法理解这里的board和post。 尝试在 return render
期间将其与模板一起通过上下文发送试试这个:
return render(request, 'topic_posts.html', {'topic': topic, 'board': board, 'post': post})