You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何将表单数据传递到视图以实现数据筛选展示

问题描述

我在views.py中有两个函数,第一个用于展示数据表中的信息,第二个用于获取表单数据并重定向到结果页面。请问如何将从表单获取的数据传递到第一个函数,以便基于这些数据展示对应的数据表信息?


现有代码

views.py

# 第一个函数:展示数据表信息
def SuOp(request): 
    allrooms = Rooms.objects.all()
    allfood = Food.objects.all()
    alltours = Tours.objects.all()  
    
    data = {   
        'allfood': allfood, 
        'allrooms': allrooms,
        'alltours': alltours,
    }

    return render(request, './obj.html', data)

# 第二个函数:处理表单提交并跳转
def Main(request):
    error = ''
    if request.method == 'POST':
        form = SearchMain(request.POST)
        if form.is_valid():
              budget = form.cleaned_data.get("budget") 
              arrival_date = form.cleaned_data.get("arrival_date") 
              departure_date = form.cleaned_data.get("departure_date") 
              number_of_people = form.cleaned_data.get("number_of_people")
              count_days = (departure_date-arrival_date).days 
              return redirect('allobject')

        else:
              error = '表单填写有误'

    form = SearchMain()

    data = {
        'formS': form,
        'error': error,
    }

    return render(request, './main.html', data)

urls.py

urlpatterns = [
    path('', views.Main, name='main'),
    path(r'allobject/$', views.SuOp, name='allobject')
]

解决方案

给你两种常用的实现方式,按需选择:

方式一:通过URL参数传递

适合数据量小、非敏感的场景,直接把表单数据拼到跳转URL里,再在SuOp中读取参数并过滤数据。

步骤1:修改Main函数的跳转逻辑

用reverse生成带参数的跳转URL:

from django.urls import reverse

def Main(request):
    error = ''
    if request.method == 'POST':
        form = SearchMain(request.POST)
        if form.is_valid():
              budget = form.cleaned_data.get("budget") 
              arrival_date = form.cleaned_data.get("arrival_date") 
              departure_date = form.cleaned_data.get("departure_date") 
              number_of_people = form.cleaned_data.get("number_of_people")
              count_days = (departure_date-arrival_date).days 
              
              # 生成带参数的跳转URL
              redirect_url = reverse('allobject') + f'?budget={budget}&arrival={arrival_date}&departure={departure_date}&people={number_of_people}'
              return redirect(redirect_url)

        else:
              error = '表单填写有误'

    form = SearchMain()

    data = {
        'formS': form,
        'error': error,
    }

    return render(request, './main.html', data)

步骤2:修改SuOp函数读取参数并过滤数据

从request.GET获取参数,根据参数过滤查询集(需匹配你的模型字段,以下为示例):

def SuOp(request): 
    # 获取URL参数
    budget = request.GET.get('budget')
    arrival_date = request.GET.get('arrival')
    departure_date = request.GET.get('departure')
    number_of_people = request.GET.get('people')

    # 初始化查询集
    allrooms = Rooms.objects.all()
    allfood = Food.objects.all()
    alltours = Tours.objects.all()  

    # 根据参数过滤数据(示例,需匹配你的模型字段)
    if budget:
        allrooms = allrooms.filter(price_per_night__lte=budget)
        allfood = allfood.filter(price__lte=budget)
        alltours = alltours.filter(cost__lte=budget)
    if number_of_people:
        allrooms = allrooms.filter(capacity__gte=number_of_people)
        alltours = alltours.filter(max_people__gte=number_of_people)
    # 日期相关过滤逻辑同理,根据模型字段调整

    data = {   
        'allfood': allfood, 
        'allrooms': allrooms,
        'alltours': alltours,
        # 传递参数给模板,方便展示搜索条件
        'search_params': {
            'budget': budget,
            'arrival_date': arrival_date,
            'departure_date': departure_date,
            'number_of_people': number_of_people
        }
    }

    return render(request, './obj.html', data)

方式二:通过Django Session存储数据

适合数据敏感、参数较多的场景,用Session临时存储表单数据。

步骤1:修改Main函数,把数据存入Session

def Main(request):
    error = ''
    if request.method == 'POST':
        form = SearchMain(request.POST)
        if form.is_valid():
              budget = form.cleaned_data.get("budget") 
              arrival_date = form.cleaned_data.get("arrival_date") 
              departure_date = form.cleaned_data.get("departure_date") 
              number_of_people = form.cleaned_data.get("number_of_people")
              count_days = (departure_date-arrival_date).days 
              
              # 把数据存入session(日期转字符串存储)
              request.session['search_params'] = {
                  'budget': budget,
                  'arrival_date': arrival_date.strftime('%Y-%m-%d'),
                  'departure_date': departure_date.strftime('%Y-%m-%d'),
                  'number_of_people': number_of_people
              }
              return redirect('allobject')

        else:
              error = '表单填写有误'

    form = SearchMain()

    data = {
        'formS': form,
        'error': error,
    }

    return render(request, './main.html', data)

步骤2:修改SuOp函数,从Session读取数据并过滤

def SuOp(request): 
    # 从session获取搜索参数
    search_params = request.session.get('search_params', {})
    budget = search_params.get('budget')
    arrival_date = search_params.get('arrival_date')
    departure_date = search_params.get('departure_date')
    number_of_people = search_params.get('number_of_people')

    # 过滤查询集(示例,需匹配你的模型字段)
    allrooms = Rooms.objects.all()
    allfood = Food.objects.all()
    alltours = Tours.objects.all()  

    if budget:
        allrooms = allrooms.filter(price_per_night__lte=budget)
        allfood = allfood.filter(price__lte=budget)
        alltours = alltours.filter(cost__lte=budget)
    if number_of_people:
        allrooms = allrooms.filter(capacity__gte=number_of_people)
        alltours = alltours.filter(max_people__gte=number_of_people)
    # 日期字符串转date对象后过滤(示例)
    if arrival_date and departure_date:
        from datetime import datetime
        arrival_date = datetime.strptime(arrival_date, '%Y-%m-%d').date()
        departure_date = datetime.strptime(departure_date, '%Y-%m-%d').date()
        allrooms = allrooms.filter(available_from__lte=arrival_date, available_to__gte=departure_date)

    data = {   
        'allfood': allfood, 
        'allrooms': allrooms,
        'alltours': alltours,
        'search_params': search_params
    }

    # 用完删除session参数,避免后续访问受影响
    if 'search_params' in request.session:
        del request.session['search_params']

    return render(request, './obj.html', data)

内容的提问来源于stack exchange,提问作者Prost0Lime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:05:20