使用';获取';窗体将值传递给Django中的下一个视图

使用';获取';窗体将值传递给Django中的下一个视图,django,forms,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:searc

我尝试使用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)
和simpleforms.py

class SearchForm
    country = models.ChoiceField(choices=COUNTRY)
    city= models.ChoiceField(choices=CITY)
我尝试使用args(将城市和国家传递给
搜索结果
视图)
HttpResponseRedirect(反向('app:search\u results',args=[country,city])
但我的url下一个视图如下所示:

http://127.0.0.1:8000/search-results/USA/new-york/
但我希望这样(在重定向到下一个视图后):

我该怎么做?例如,在选择了这方面的工作的位置和类型之后,我们会看到一个类似于示例2而不是示例1的url(与大多数网站一样)

编辑 url.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'),
从django.url导入路径
从…起导入视图
URL模式=[
路径(“”,views.search,name='search'),
路径('search-results//',views.search\u results,name='search\u results'),

如果我理解清楚的话,这并不难, 您可以调用重定向以转到另一个模板,并反向调用来自“url.py”的链接,只需调用所需的值


返回重定向(reverse('urlink')+“?id=“+object.idObject)

如果我理解清楚的话,这并不难, 您可以调用重定向以转到另一个模板,并反向调用来自“url.py”的链接,只需调用所需的值

return redirect(reverse('urlink')+“?id=“+object.idObject)

您可以定义一个。因此,您可以生成这样的
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())
)
您需要从
url.py中删除参数:

否则,这些参数将丢失。

您可以定义一个。因此,您可以生成这样的
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())
)
您需要从
url.py中删除参数:


因为在其他方面,这些参数都丢失了。

虽然Willem Van Onsem的答案在技术上是正确的,但这里可能不会通过代码审查

这里简单、明显、规范的解决方案是使用一个视图来验证表单和显示结果,并将表单指向该视图的url(这就是HTML表单的“action”属性的作用)


如果您希望表单显示在所有页面上(或至少一个以上页面上),搜索表单通常就是这样,那么您只需要一个简单的自定义模板标签,创建一个空表单(指向“搜索”url)虽然Willem Van Onsem的答案在技术上是正确的,但这里可能不会通过代码审查

这里简单、明显、规范的解决方案是使用一个视图来验证表单和显示结果,并将表单指向该视图的url(这就是HTML表单的“action”属性的作用)


如果您希望表单显示在所有页面上(或至少一个以上页面上),搜索表单通常就是这样,那么您只需要一个简单的自定义模板标签,创建一个空表单(指向“搜索”url).py

你能分享你的
URL.py
吗?你能分享你的
URL.py
吗?请不要手动编码查询字典。如果你的值包含
+
&
等字符,那么这些字符需要转义。是的,我只是想快速解决问题;),请不要手动加密ode查询字典。如果您的值包含
+
&
等字符,则需要对这些字符进行转义。是的,我只是想给出一个快速解决的问题;),“官僚康拉德,您在技术上是正确的-最好的正确类型。我特此将您提升到37级。”(请允许我指出,这里真正的问题不是“如何做”,而是“当它完全无用时,为什么有人会这样做”);-@Brunodesshuilliers:如果你有多个按钮,每个按钮都有一个
名称和(
值例如,您可以定义一个按钮
Search all
history
。通常在软件设计中,正交的事情是由不同的事情执行的(我同意命令式编程有更多的问题)。但在这种情况下,我建议使用重定向。请注意,我们在这里的功能是“pop”querystring中的
search=…
参数:)我很少有两个不同的提交按钮以相同的形式出现(在近20年的时间里……),每当发生这种情况时,后面的功能几乎都不符合“正交”的条件.IOW,如果你有两个按钮做不同的事情,你肯定需要两个不同的表单,每个表单都指向它自己的url。我的2美分…NB:我不是说在表单提交和结果url之间没有重定向的正当理由,但是1/这在我的经验中是非常罕见的,2/她仍然不需要e(当然,除非你知道一些关于这个项目的问题中没有提到的东西)@Brunodesshuilliers:事实上,可能引入了一些数据,因为
search
get参数来自某处:),它不能成为表单的一部分(假设表单不包含额外字段):)。使用
formaction=
属性等可能没有必要。但不知何故,这是不受欢迎的。不幸的是,嵌套表单在HTML中是不可能的(这是有道理的,因为这会带来很多语义问题)。“康拉德官僚,你从技术上讲是正确的,这是最好的正确。我特此将你提升到37级。”(请注意,我可以建议,这里真正的问题不是“如何做到这一点”,而是“为什么有人会在完全没有用的情况下这么做”)-)@brunodesshuilliers:如果你有多个按钮,每个按钮都有一个
名称
和(
),那么这是一种常见的模式
>>> qd = QueryDict(mutable=True)
>>> qd.update(country='USA', city='new york')
>>> qd.urlencode()
'country=USA&city=new+york'
path('search-results/', views.search_results, name='search_results'),