Django如何重写CreateView通过url slug参数动态指定model和form
Django类视图根据URL参数动态匹配模型与表单的实现方案
需要重写的核心方法
你需要重写CreateView内置的get_model()和get_form_class()两个方法,既符合Django类视图的设计规范,也不需要修改原有视图的核心执行流程。
完整代码示例如下:
from django.http import Http404 from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from tables.models import subcomponentsTable, rawMaterialsTable from tables.forms import subcomponentsTableForm, rawMaterialsTableForm class createTableView(LoginRequiredMixin, CreateView): template_name = 'tables/createTableTemplate.html' # 定义URL参数slug和模型、表单的映射关系,新增类型直接扩展该字典即可 table_type_map = { "equipment": { "model": subcomponentsTable, "form_class": subcomponentsTableForm }, "raw-material": { "model": rawMaterialsTable, "form_class": rawMaterialsTableForm } } def get_model(self): # 从URL参数中获取tableType table_type = self.kwargs.get("tableType") if table_type not in self.table_type_map: raise Http404("请求的表格类型不存在") return self.table_type_map[table_type]["model"] def get_form_class(self): table_type = self.kwargs.get("tableType") return self.table_type_map[table_type]["form_class"]
适配UpdateView、DeleteView的差异
该逻辑可以快速复用在UpdateView和DeleteView上,仅存在两点小差异:
- DeleteView不需要渲染和处理表单,因此不需要重写
get_form_class()方法,仅保留get_model()的匹配逻辑即可 - UpdateView和DeleteView需要操作指定的单条数据,所以对应的URL需要额外增加主键(pk)或唯一slug参数,示例如下:
urlpatterns = [ # 新增实例路由 path('new/<slug:tableType>', views.createTableView.as_view(), name='newInstance'), # 编辑实例路由,新增pk参数 path('edit/<slug:tableType>/<int:pk>', views.updateTableView.as_view(), name='editInstance'), # 删除实例路由,新增pk参数 path('delete/<slug:tableType>/<int:pk>', views.deleteTableView.as_view(), name='deleteInstance'), ]
除以上两点外,核心的类型匹配逻辑完全通用,不需要额外修改。
内容的提问来源于stack exchange,提问作者Cucumento
相关产品推荐
相关产品推荐

