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

