0

我有以下看法:

def process(request):
    if request.method == 'POST':
        data = request.POST
        results = Specs.objects.filter(screenGroup = data['screen_user'], storage = data['storage_user'], mSystem = data['system_user'] )
        context = {'results' : results}
        return render(request, 'process.html', context)

当用户输入三个值时,它会正确过滤,但是当它只输入一个或两个(或什么都不输入)时,它会过滤传递值 None。如果未设置过滤器,有什么方法可以忽略它?

谢谢!

编辑:

下面的代码是有效的,但它显然是一种非常低效的方式:

def process(request):
    if request.method == 'POST':
       data = request.POST
       if(data['screen_user'] != None):
           results = Specs.objects.filter(screenGroup = data['screen_user'])
        elif (data['storage_user'] != None):
           results = Specs.objects.filter(storage = data['storage_user'])
        else:
           results = Specs.objects.all()
           #plus all the other options...
        context = {'results' : results}
        return render(request, 'process.html', context)
4

2 回答 2

2

这称为验证您的表单。. 有两种方法可以做到这一点:

  1. 创建一个 django 表单并使用 myform.is_valid()。您可以在文档中阅读它

  2. 使用一些“if”语句自行验证(在服务器端或在发送 ajax 调用之前使用 javascript)

于 2013-08-19T14:42:08.577 回答
2

您可以预先构建过滤器:

def process(request):
    if request.method == 'POST':
        data = request.POST
        spec_filter = {}
        for attribute in ['screenGroup', 'storage', 'mSystem']:
            if attribute in data and data[attribute]:
                spec_filter[attribute] = data[attribute] 
        results = Specs.objects.filter(**spec_filter)
        context = {'results' : results}
        return render(request, 'process.html', context)

注意:要逐字使用,您必须更改在 request.POST 中传递的变量的名称以匹配Specs模型中的变量。我这样做只是为了说明,但您可以轻松地对变量名使用相同的原则。在这种情况下,您将不得不更加冗长。

于 2013-08-19T14:59:26.740 回答