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
相关产品推荐
相关产品推荐

