视图中有多个过滤器选项。正确设置这些过滤器。仅设置一个“禁用”fi

2024-04-26 00:13:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张表格

第一个提交到数据库。工作完美。 第二种检索数据库信息,也可以正常工作

然而,我在表单中有一些过滤器工作得并不完美

我有几个过滤器

  • 位置
  • 类型
  • 日期范围

如果设置了所有过滤器,它们将正常工作

如果只设置了一个,则它们不起作用。我不明白为什么会这样

forms.py(筛选表单):

class OvertimeForm(forms.ModelForm):
    location = forms.ModelChoiceField(
        queryset=Location.objects.all(),
        empty_label="All Locations",
        widget=forms.Select(attrs={'class': 'form-control'}))

    overtime_type = forms.ModelChoiceField(
        queryset=overtimeTypes.objects.all(),
        empty_label='All Types', 
        widget=forms.Select(attrs={'class': 'form-control'}))

    dateStart = forms.DateField(
        widget=forms.DateInput(attrs={'class':'datepicker'}))

    dateEnd = forms.DateField(
        widget=forms.DateInput(attrs={'class':'datepicker'}))

    class Meta:
        model = Overtime
        fields = ['location']
        fields = ['overtime_type']
        field = ['dateStart']
        field = ['dateEnd']

views.py(筛选表单):

def Overtime_Results(request):
    userGroup = request.user.groups.get(name__in=['Comp1' ,'Comp2' , 'Comp3' , 'Comp4'])
    overtime_data = Overtime.objects.filter(client__name=userGroup)
    location = None
    overtime_type = None
    dateStart = date.today()
    dateEnd = date.today()

if request.method == 'POST':
    form = OvertimeForm(data=request.POST)

    if form.is_valid():
        location = form.data['location']
        dateStart = form.data['dateStart']
        dateEnd = form.data['dateEnd']
        overtime_type = form.data['overtime_type']

        #This is where I think the problem is, something here isn't correct.
        overtime_data = Overtime.objects.filter(location=location, overtime_type=overtime_type, overtimeDateStart__range=(dateStart, dateEnd), client__name=userGroup) 

        return response
else:
    form = OvertimeForm()

template_name = "overtime/Overtime_Results.html"
context = {
    'form': form,
    'location': location,
    'overtime_type': overtime_type,  
    'overtime_data': overtime_data,
}

return render(request, template_name, context)

在html文件中:

    <div class="col-md-3">{{ form.location }} 
      {{ form.dateStart }} <p>To</p>
      {{ form.dateEnd }}
      {{ form.overtime_type }}
    </div>

这是表单的外观:http://imgur.com/NFWU9ke


Tags: nameform表单dataobjectsrequesttypeforms
1条回答
网友
1楼 · 发布于 2024-04-26 00:13:44

你应该用你真正关心的过滤器来建立你的查询,分割查询集的创建,这仍然只会导致对数据库的一次调用,它只是更干净而已

overtime_data = Overtime.objects.all()
location = form.cleaned_data.get('location')
if location:
    overtime_data = overtime_data.filter(location=location)
# continue for other params.

您还使用了form.data而不是cleaned_data,这意味着您没有使用经过验证的数据

相关问题 更多 >