使用过滤器通过查询设置表单字段的值

时间:2019-02-05 12:20:54

标签: python django django-models django-forms django-views

我想使用表格中的查询在下拉菜单中设置项目。我想添加使用过滤器Is_Del = 0的员工和选择的公司。我不知道如何为下拉菜单设置值以及在哪里编写此查询。

我试图放入Forms.py,但无法正常工作。

这是form.py

class EmployeeCreateForm(forms.ModelForm):
     class Meta:
        model = Employee
        fields = ('Emp_Name','Emp_company','Emp_Dept','Emp_Join_Date', 'Emp_End_Date')

        def clean(self):
            cleaned_data = super(EmployeeCreateForm, self).clean()
            Emp_Name = cleaned_data.get('Emp_Name')
            Emp_company = cleaned_data.get('Emp_company')
            Emp_Dept = cleaned_data.get('Emp_Dept')
            Emp_Join_Date = cleaned_data.get('Emp_Join_Date')
            Emp_End_Date = cleaned_data.get('Emp_End_Date')
            return cleaned_data

     def __init__(self, *args, **kwargs):
        super(EmployeeCreateForm,self).__init__(*args, **kwargs)
        self.fields['Emp_company'].queryset = Company.objects.filter(Is_Del=0)

下面是我的view.py

class EmployeeCraeteView(LoginRequiredMixin,SuccessMessageMixin,CreateView):
    model=Employee
    form = EmployeeCreateForm
    success_message = " Employee Craeted successfully!"
    success_url="../../company/all-companies"
    template_name = 'employee_form.html'
    fields =[
            'Emp_Name','Emp_company','Emp_Dept','Emp_Join_Date',
            'Emp_End_Date'
            ]
    companies= Company.objects.filter(Is_Del=0)

    def form_valid(self,form):
        form.instance.Emp_Crt_By = self.request.user
        if form.cleaned_data['Emp_Join_Date'] >= form.cleaned_data['Emp_End_Date']:
            form.add_error('Emp_End_Date', 'Joining date should be less than Ending date')
            return self.form_invalid(form)
        return super(EmployeeCraeteView, self).form_valid(form)

我只想显示被Is_Del = 0过滤的公司

1 个答案:

答案 0 :(得分:1)

您的EmployeeCreateView是错误的:

  • 删除属性formfieldscompanies
  • 添加form_class = EmployeeCreateForm

原因是formCreateView中没有执行任何操作(请参阅here)。要使用自定义表单类,您需要将其传递给form_class

您的CreateView是使用modelform_factory和您定义的fields动态创建表单的(如果您没有添加这些表单,则会立即看到错误),因此您的EmployeeCreateForm从未实例化。