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

Django不同视图更新同一模型的通用视图双参数使用及实现方法

问题1解答

Django 通用视图完全支持接收多个路由参数。所有路由定义的参数都会自动存入视图的 self.kwargs 字典,通用视图默认只会取用 pk/slug 参数检索待更新的模型实例,多余的参数你可以按需自行处理,比如本次场景里的 username 参数刚好可以用来做权限校验,避免用户越权修改其他作者的书籍。

问题2实现方案

你可以直接继承 UpdateView 实现,也可以复用之前写好的 BookEditView 逻辑,核心是通过路由传入的 username 做权限过滤,确保用户只能编辑自己名下的书籍,具体实现代码如下:

视图类代码

from django.shortcuts import get_object_or_404
from django.core.exceptions import PermissionDenied
from django.views.generic.edit import UpdateView
from django.urls import reverse
from .models import User
from book.models import Book
from book.forms import BookForm # 直接复用你之前写好的书籍编辑表单

class UserEditBookView(UpdateView):
    model = Book
    form_class = BookForm
    # 可以直接复用原有的书籍编辑模板,不需要额外写新模板
    template_name = 'book/edit_book.html'

    def get_queryset(self):
        # 校验当前登录用户和路由中的用户名是否匹配,防止越权访问
        if self.request.user.username != self.kwargs['username']:
            raise PermissionDenied
        # 拿到路由中对应用户的实例
        target_user = get_object_or_404(User, username=self.kwargs['username'])
        # 过滤出该用户作为作者的书籍,确保只能编辑自有书籍
        return super().get_queryset().filter(author=target_user)
    
    # 按需重写提交成功后的跳转地址,示例为跳转到当前用户的书籍列表页
    def get_success_url(self):
        return reverse('user_book_list', kwargs={
            'username': self.kwargs['username']
        })

你的原有路由配置不需要做任何改动,写完视图直接部署即可生效。如果用户尝试编辑不属于自己的书籍,会直接返回403权限错误,符合安全要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:45:02