Django基于类视图下向表单传递MultipleChoiceField动态选项列表
Django类视图向MultipleChoiceField传递动态选项方案
核心需求
在基于类的视图开发中,需要将如下格式的二元组列表,作为选项传递给表单的MultipleChoiceField字段使用:[('ad7d4d7c5fbd4678bafd9f2b93fdd4b5', 'Chandrayaan'), ('b55d7c02c29d4501b8d3f63053fef470', 'MOM'), ('b90a66ea9eb24d019102fadde900fdda', 'Galactica')]
同时可解决提交时出现「选择有效选项,xxx不是可用选项之一」的校验报错问题。
实现步骤
步骤1:表单类定义
表单中的MultipleChoiceField无需预设固定choices,初始可设为空列表:
from django import forms class CustomForm(forms.Form): # 预留动态choices字段 select_items = forms.MultipleChoiceField( label="可选项目", required=True, widget=forms.SelectMultiple )
步骤2:类视图中动态注入选项
重写类视图的get_form方法,在该方法内完成选项的赋值操作。该方法会在GET渲染表单、POST校验表单两个阶段都被调用,可保证两次使用的选项列表完全一致,避免校验报错:
from django.views.generic.edit import FormView class CustomFormView(FormView): form_class = CustomForm template_name = "form_page.html" success_url = "/submit_success/" def get_form(self, form_class=None): form = super().get_form(form_class) # 此处替换为你自己的选项生成逻辑,可从数据库、缓存等任意数据源获取 dynamic_choices = [ ('ad7d4d7c5fbd4678bafd9f2b93fdd4b5', 'Chandrayaan'), ('b55d7c02c29d4501b8d3f63053fef470', 'MOM'), ('b90a66ea9eb24d019102fadde900fdda', 'Galactica') ] form.fields['select_items'].choices = dynamic_choices return form
注意事项
- 必须保证POST校验阶段的选项列表和GET渲染阶段的选项列表完全一致,若两者存在差异会直接触发选项校验失败错误
- 若选项从数据库动态生成,需将查询逻辑写在
get_form方法内部,不要定义为类属性,避免类加载时仅查询一次导致选项无法实时更新 - 若使用的是
ModelMultipleChoiceField字段,只需将上述赋值choices的逻辑替换为赋值queryset即可
内容的提问来源于stack exchange,提问作者Divit Rao
相关产品推荐
相关产品推荐

