Python I';我正在努力使用django queryset创建具有多个条件的搜索函数

Python I';我正在努力使用django queryset创建具有多个条件的搜索函数,python,django,django-queryset,Python,Django,Django Queryset,url.py 来自django.contrib导入管理 从django.url导入路径,包括 从main.views导入main、返回和清理、创建合同、显示记录、确认、删除、等待、删除合同、单元信息、推送、创建、删除 从main.views导入btn\u条件\u更改 从login.views导入登录、注销、注册 从影响者数据库视图导入影响者板 URL模式=[ 路径('admin/',admin.site.url), 路径('home/',main,name='home'), 路径('delete

url.py

来自django.contrib导入管理
从django.url导入路径,包括
从main.views导入main、返回和清理、创建合同、显示记录、确认、删除、等待、删除合同、单元信息、推送、创建、删除
从main.views导入btn\u条件\u更改
从login.views导入登录、注销、注册
从影响者数据库视图导入影响者板
URL模式=[
路径('admin/',admin.site.url),
路径('home/',main,name='home'),
路径('delete/',返回并清除,name=“delete”),
路径(“”,login,name='login'),
路径('logout/',logout,name='logout'),
路径('sign_up/',signup,name='signup'),
路径('create_contract/',create_contract,name='create_contract'),
路径('contract\u board/',show\u record,name='contract\u board'),
路径('confirm/',confirm,name='confirm'),
路径('delete/',delete,name='delete'),
路径('wait/',wait,name='wait'),
路径('delete_contract/',delete_contract,name='delete_contract'),
路径('btn\U info/',单元btn\U info,名称='btn\U info'),
路径('btn_push/',btn_push,name=“btn_push”),
路径('btn_create/',btn_create,name='btn_create'),
路径('btn_delete/',btn_delete,name='btn_delete'),
路径('btn\U条件\U更改/',btn\U条件\U更改,名称='btn\U条件\U更改'),
路径('influencer\u board/',influencer\u board,name=“internal\u influencer”),
像上面的代码一样,我从用户那里得到了7个搜索条件。此外,如果用户输入的条件少于7个,我仍然希望使用这些条件筛选数据库。但是,它不断出现以下错误:

该函数似乎工作正常,因为URL

http://127.0.0.1:8000/influencer_board/GET?
sns_类型=%EC%9D%B8%EC%8A%A4%ED%83%80%EA%B7%B8%EB%9E%A8和追随者人数最小=18000
&follower\u num\u max=&name=&gender=&sns\u id=&keyword=

包含我提交但出现404错误的条件。如何解决此问题?

您的视图代码可以减少和简化。所有7个字段都有类似的筛选逻辑,因此我们可以构建要筛选的字段列表(包括其字段筛选器,如
\u icontains
\u gte
)并在该列表上迭代,而不是将几乎相同的内容写7次

这里有一个建议,应该用更少的代码实现相同的功能

def influencer_board(request):
    user_input = []
    index_list = []
    influencer = Influencer_DB.objects.all()
    if request.method == 'GET':
        sns_type = request.GET.get('sns_type') #0
        follower_num_min = request.GET.get('follower_num_min') #1
        follower_num_max = request.GET.get('follower_num_max') #2
        name = request.GET.get('name')#3
        gender = request.GET.get('gender')#4
        sns_id = request.GET.get('sns_id')#5
        keyword = request.GET.get('keyword')#6

        user_input.append(sns_type)
        user_input.append(follower_num_min)
        user_input.append(follower_num_max)
        user_input.append(name)
        user_input.append(gender)
        user_input.append(sns_id)
        user_input.append(keyword)

        for col in user_input:
            if col != "":
                index = user_input.index(col)
                index_list.append(index)

        influencer = Influencer_DB.objects
        for index in index_list:
            if index == 0:
                influencer = influencer.filter(sns_type=sns_type)
            if index == 1:
                influencer = influencer.filter(follower_num__gte = follower_num_min)
            if index == 2:
                influencer = influencer.filter(follower_num__lte = follower_num_max)
            if index == 3:
                influencer = influencer.filter(name=name)
            if index == 4:
                influencer = influencer.filter(gender = gender)
            if index == 5:
                influencer = influencer.filter(sns_id=sns_id)
            if index == 6:
                influencer = influencer.filter(keyword__icontains = keyword)

        return render(request,"influencer_board.html",{'influencer':influencer,"sns_type":sns_type,'follower_num_max':follower_num_max, 'followever':follower_num_min,'name':name, 'gender':gender,'sns_id':sns_id,'keyword':keyword})
    return render(request,"influencer_board.html",{'influencer':influencer})

请显示您的URL.pyURL
/influencer\u board/GET
在您的URL配置中不存在,并且您显示的视图也不会重定向到该URL。因此,此请求提交的来源是哪里?您可以显示提交此请求的模板吗?
FILTER_KEYS = (
    ('sns_type', 'sns_type'),
    ('follower_num_min', 'follower_num__gte'),
    ('follower_num_max', 'follower_num__lte'),
    ('name', 'name'),
    ('gender', 'gender'),
    ('sns_id', 'sns_id'),
    ('keyword', 'keyword__icontains'),
)

def influencer_board(request):
    qs = Influencer_DB.objects.all()
    ctx = {}

    if request.method == 'GET':
        for key, field_with_filter in FILTER_KEYS:
            v = request.GET.get(key, '').strip()
            if len(v) == 0:
                # it's empty, so skip this
                continue

            # filter the QuerySet
            qs = qs.filter(**{field_with_filter: v})

            # add to context for template rendering
            ctx[key] = v

    # add to context for template rendering
    ctx['influencer'] = qs

    return render(request, "influencer_board.html", ctx)