Django中如何通过GET方式以查询参数传递表单值至下一视图
解决方案
要实现带查询参数的URL跳转,你需要调整三个核心部分:URL配置、表单类写法,以及视图里的重定向逻辑,具体步骤如下:
1. 修正URL配置
你当前的search_results路径是基于路径参数设计的,但查询参数(?country=USA&city=new-york)不需要在URL模式里提前定义。修改urls.py如下:
from django.urls import path from . import views urlpatterns = [ path('', views.search, name='search'), # 移除路径参数,改为普通的结果页路径 path('search-results/', views.search_results, name='search_results'), ]
2. 修复表单类的写法
你的SearchForm存在写法错误——应该继承Django的forms.Form类,而非直接使用models模块的字段。正确的表单定义如下:
from django import forms # 假设你已提前定义好选项元组 COUNTRY = (('USA', 'USA'), ('CA', 'Canada')) CITY = (('new-york', 'New York'), ('toronto', 'Toronto')) class SearchForm(forms.Form): country = forms.ChoiceField(choices=COUNTRY) city = forms.ChoiceField(choices=CITY)
3. 修改重定向逻辑,拼接查询参数
在search视图里,args是用来传递路径参数的,要生成查询参数,需要先拿到基础URL,再手动拼接参数串:
from django.urls import reverse from django.http import HttpResponseRedirect def search(request): if request.method == 'GET' and 'search' in request.GET: form = SearchForm(request.GET) if form.is_valid(): # 从表单的清洗后数据中取值 country = form.cleaned_data['country'] city = form.cleaned_data['city'] # 获取结果页的基础URL base_url = reverse('app:search_results') # 拼接查询参数 query_string = f'?country={country}&city={city}' return HttpResponseRedirect(base_url + query_string) else: form = SearchForm() context = {'form': form} return render(request, 'search.html', context)
4. 在结果页视图中获取查询参数
最后,在search_results视图里,你可以通过request.GET.get()来读取这些查询参数:
def search_results(request): country = request.GET.get('country') city = request.GET.get('city') # 这里添加你的业务逻辑,比如根据参数查询数据 context = {'country': country, 'city': city} return render(request, 'search_results.html', context)
调整完成后,跳转后的URL就会变成你期望的http://127.0.0.1:8000/search-results/?country=USA&city=new-york,和主流网站的搜索结果URL格式一致。
内容的提问来源于stack exchange,提问作者Maddie Graham
相关产品推荐
相关产品推荐

