使用“获取”表单将值传递给Django中的下一个视图

时间:2019-08-19 09:19:06

标签: django forms

我尝试使用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'),

3 个答案:

答案 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”属性的作用)。

如果您希望将表单显示在所有页面上(或至少一个以上)(就像搜索表单一样),那么您所需要的只是一个简单的自定义模板标签,该模板标签会创建一个空白表单(到您的“搜索”网址)。