You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何在编辑评论的同一URL传递两个模型的主键?

解决Django中编辑评论URL传递多个主键的问题

你遇到的核心问题是URL中重复使用pk参数名导致冲突,同时UpdateView默认只会识别pk参数来获取对象。下面是分步解决方法:

1. 修改URL配置(urls.py)

将编辑评论的URL路径中的两个主键参数设置为不同名称,比如post_pk(对应帖子主键)和comment_pk(对应评论主键):

urlpatterns = [
    path("post/<int:pk>/comments/", login_required(CommentsView.as_view(), login_url='signin'), name="comments"),
    path("post/<int:pk>/comments/add/", login_required(AddCommentView.as_view(), login_url='signin'), name="add-comment"),
    # 修改参数名避免重复冲突
    path("post/<int:post_pk>/comments/<int:comment_pk>/edit/", login_required(EditCommentView.as_view(), login_url='signin'), name="edit-comment"),
]

2. 更新视图类(views.py)

UpdateView默认使用pk参数查询对象,所以需要指定pk_url_kwarg为我们定义的comment_pk,让视图用评论主键获取对应的Comment对象。如果需要验证评论属于当前帖子,还可以额外过滤查询集:

class EditCommentView(UpdateView):
    model = Comment
    form_class = EditCommentForm
    template_name = "edit_comment.html"
    # 指定用comment_pk作为主键参数
    pk_url_kwarg = 'comment_pk'

    # 可选:确保用户只能编辑当前帖子下的评论
    def get_queryset(self):
        queryset = super().get_queryset()
        # 过滤出属于当前帖子的评论
        return queryset.filter(post_id=self.kwargs['post_pk'])

3. 修正模板中的URL调用

确保模板中调用edit-comment时传递的参数顺序和URL中的参数名对应(先传帖子主键,再传评论主键):

<!-- 替换原来的编辑链接 -->
<a class="text-indigo-500 inline-flex items-center mt-4" href="{% url 'edit-comment' post.id comment.id %}">
    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil-square" viewBox="0 0 16 16">
        <path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/>
        <path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"/>
    </svg>
</a>

如果模板中使用的是post_id变量(而非post.id),直接替换为{% url 'edit-comment' post_id comment.id %}即可。

这样修改后,URL就能正确传递两个主键参数,视图也能正确获取对应的Comment对象,同时可以验证评论所属的帖子,避免越权编辑。

内容的提问来源于stack exchange,提问作者Ekansh Virmani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:27:32