我尝试使用get方法将值(从已完成的表单)从一个视图传递到下一个视图。我的视图看起来像这样。
def search(request):
if request.method == 'GET' and 'search' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
return HttpResponseRedirect(reverse('app:search_results'))
else:
form = SearchForm()
context = {'form': form}
return render(request, 'search.html', context)
和简单的 forms.py
class SearchForm
country = models.ChoiceField(choices=COUNTRY)
city= models.ChoiceField(choices=CITY)
我尝试使用args(将城市和国家/地区传递到search_results
视图)HttpResponseRedirect(reverse('app:search_results', args=[country, city]))
但我的网址下一个视图如下所示:
http://127.0.0.1:8000/search-results/USA/new-york/
但是我希望这样(重定向到下一个视图之后):
http://127.0.0.1:8000/search-results/?country=USA&city=new-york&
我该怎么做?例如,在此page上选择工作的位置和类型后,我们看到与示例2而非1类似的网址(与大多数网站一样)。
任何帮助将不胜感激。
编辑:
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.search, name='search'),
path('search-results/<country>/<city>/', views.search_results, name='search_results'),
答案 0 :(得分:0)
如果我理解清楚的话,并不难, 您可以调用重定向以继续使用另一个模板,然后反向调用以使链接来自“ urls.py”,只需调用所需的值即可。
return redirect(reverse redirect(reverse('urllink')+“?id =” + object.idObject)
答案 1 :(得分:0)
您可以定义QueryDict
[Django-doc]。因此,您可以生成这样的QueryDict
来构造查询参数,例如:
from django.http import QueryDict
qd = QueryDict(mutable=True)
qd.update(country='USA', city='new york')
return HttpResponseRedirect(
'{}?{}'.format(reverse('app:search_results'), qd.urlencode())
)
如果您以此urlencode()
查询词,您将得到:
>>> qd = QueryDict(mutable=True)
>>> qd.update(country='USA', city='new york')
>>> qd.urlencode()
'country=USA&city=new+york'
您将需要从urls.py
中删除参数:
path('search-results/', views.search_results, name='search_results'),
因为否则这些参数将丢失。
答案 2 :(得分:0)
虽然威廉姆·范·昂塞姆(Willem Van Onsem)的回答在技术上是正确的,但这里可能不会通过代码审查。
这里的简单,明显,规范的解决方案是使用一个视图来验证表单并显示结果,并将表单指向该视图的url(这就是HTML表单的“ action”属性的作用)。
如果您希望将表单显示在所有页面上(或至少一个以上)(就像搜索表单一样),那么您所需要的只是一个简单的自定义模板标签,该模板标签会创建一个空白表单(到您的“搜索”网址)。