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
相关产品推荐
相关产品推荐

