Django中forms.py设置queryset为objects.none()后下拉框仍显示全部选项
问题根因
一共有三处核心错误导致你的配置不生效:
- 表单类继承错误:你需要基于模型生成表单,
TaskDetails类应该继承forms.ModelForm,而你当前继承的是普通forms.Form,类下的Meta配置不会生效,表单字段并非从Task模型生成,你修改的字段根本不是目标下拉字段。 - 操作的字段名错误:你的Task模型中关联CPA_Client的外键字段名为
Client_of_CPA,并非name,你修改的self.fields['name']和你要控制的CPA客户下拉列表完全无关。 - 视图未指定自定义表单:你的
TaskCreateView、TaskUpdateView中仅指定了model=Task,没有配置form_class = TaskDetails,Django会自动生成默认的模型表单,完全不会执行你写的自定义表单逻辑。
修复代码
修正后的forms.py
from django import forms from .models import Task, CPA_Client # 改为继承ModelForm class TaskDetails(forms.ModelForm): class Meta: model = Task fields = '__all__' def __init__(self, *args, **kwargs): super(TaskDetails, self).__init__(*args, **kwargs) # 改为正确的外键字段名 self.fields['Client_of_CPA'].queryset = CPA_Client.objects.none()
修正后的视图类代码
Django通用视图没有model_form_upload钩子方法,你写的该方法不会生效,改用官方标准的form_valid钩子处理表单提交逻辑:
class TaskCreateView(LoginRequiredMixin, CreateView): model = Task # 指定使用自定义表单,无需再配置fields参数 form_class = TaskDetails success_url = '/' def form_valid(self, form): form.instance.Author = self.request.user return super().form_valid(form) class TaskUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Task # 指定使用自定义表单 form_class = TaskDetails success_url = '/' def form_valid(self, form): form.instance.Author = self.request.user return super().form_valid(form) def test_func(self): task = self.get_object() return self.request.user == task.Author
内容的提问来源于stack exchange,提问作者Kushagra A. Nalwaya
相关产品推荐
相关产品推荐

