Django如何从URL获取slug为CreateView表单自动关联Tree外键
实现步骤
你无需修改现有表单、URL配置,仅需要调整CreateFallacyView的逻辑即可完成需求:
- 从URL的命名参数中取出
slug_tree,查询匹配的Tree实例 - 将Tree实例赋值给表单生成的Fallacy对象的tree外键字段
修改后的views.py代码如下:
from django.shortcuts import get_object_or_404 from django.urls import reverse from django.views import generic from . import forms, models class CreateFallacyView(generic.CreateView): form_class = forms.FallacyForm # 处理表单提交逻辑 def form_valid(self, form): # 获取URL中携带的slug_tree参数,查询对应Tree,不存在则返回404 target_tree = get_object_or_404(models.Tree, slug=self.kwargs["slug_tree"]) # 给未保存的Fallacy实例赋值tree外键 form.instance.tree = target_tree return super().form_valid(form) # 可选:配置创建成功后跳转到对应Tree的详情页 def get_success_url(self): return reverse("argtree:tree_detail", kwargs={"slug_tree": self.kwargs["slug_tree"]}) # 可选:将当前Tree实例传入模板上下文,方便模板渲染所属Tree的相关信息 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["current_tree"] = get_object_or_404(models.Tree, slug=self.kwargs["slug_tree"]) return context
更优雅的复用方案
如果后续有多个视图都需要通过slug_tree参数获取Tree实例,可以封装公共Mixin类避免重复代码:
# 公共Mixin,封装根据slug获取Tree的逻辑 class TreeFromSlugMixin: def get_current_tree(self): if not hasattr(self, "_cached_tree"): self._cached_tree = get_object_or_404(models.Tree, slug=self.kwargs["slug_tree"]) return self._cached_tree # 改造后的CreateFallacyView class CreateFallacyView(TreeFromSlugMixin, generic.CreateView): form_class = forms.FallacyForm def form_valid(self, form): form.instance.tree = self.get_current_tree() return super().form_valid(form) def get_success_url(self): return reverse("argtree:tree_detail", kwargs={"slug_tree": self.kwargs["slug_tree"]}) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["current_tree"] = self.get_current_tree() return context
内容的提问来源于stack exchange,提问作者LJag
相关产品推荐
相关产品推荐

