如何将Django表单视图适配为django-bootstrap-modal-forms并处理后台字段填充
解决方案
1. 填充非表单必填字段
在BSModalCreateView中,你可以通过重写form_valid方法实现后台字段的自动填充,逻辑和原函数视图一致:
from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import redirect from bootstrap_modal_forms.generic import BSModalCreateView class AddItem(LoginRequiredMixin, BSModalCreateView): template_name = 'add_item.html' form_class = CreateItemForm success_message = 'Success: Item was created.' def form_valid(self, form): # 暂不提交到数据库 obj = form.save(commit=False) # 填充后台自动赋值字段 obj.created_country = Constants.country_code obj.created_by = self.request.user obj.save() # 直接跳转到带slug的详情页 return redirect('category:item_detail', slug=obj.slug)
注:这里用
LoginRequiredMixin替代原函数视图中的登录判断,自动拦截未登录用户,无需手动写权限校验逻辑。
2. 动态生成带slug的跳转链接
如果不想在form_valid里直接处理跳转,也可以重写get_success_url方法,动态获取新建对象的slug:
from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse from bootstrap_modal_forms.generic import BSModalCreateView class AddItem(LoginRequiredMixin, BSModalCreateView): template_name = 'add_item.html' form_class = CreateItemForm success_message = 'Success: Item was created.' def form_valid(self, form): self.object = form.save(commit=False) self.object.created_country = Constants.country_code self.object.created_by = self.request.user self.object.save() return super().form_valid(form) def get_success_url(self): # 通过self.object获取新建对象的slug,动态生成跳转链接 return reverse('category:item_detail', kwargs={'slug': self.object.slug})
关键注意点
- 确保
CreateItemForm中未包含created_country和created_by字段,避免前端渲染这些字段导致逻辑冲突。 LoginRequiredMixin必须放在BSModalCreateView前面,保证权限校验逻辑优先执行。
内容的提问来源于stack exchange,提问作者oarar
相关产品推荐
相关产品推荐

