Python 将用户值从一个模板重定向到另一个模板-Django
尝试重定向值由用户从一页到下一页给出。 一切都可以在一个视图中完成,但当我尝试使用HttpResponseRedirect Django返回错误“NameError at/search_results,name”“未定义”重定向到下一个视图时。如何将“文本”值从一个视图传递到另一个视图(到我的搜索结果) My views.py(运行良好,值由用户在一个字段中给出,从django过滤器返回相应的固化结果) My test.htmlPython 将用户值从一个模板重定向到另一个模板-Django,python,django,django-filter,Python,Django,Django Filter,尝试重定向值由用户从一页到下一页给出。 一切都可以在一个视图中完成,但当我尝试使用HttpResponseRedirect Django返回错误“NameError at/search_results,name”“未定义”重定向到下一个视图时。如何将“文本”值从一个视图传递到另一个视图(到我的搜索结果) My views.py(运行良好,值由用户在一个字段中给出,从django过滤器返回相应的固化结果) My test.html <h1>TEST_1</h1> &
<h1>TEST_1</h1>
<form method="POST" class="post-form">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Submit</button>
</form>
<h2> {{ text }} </h2>
<h1><br></br></h1>
{% for profile in filter.qs %}
<li>{{ profile.name }} </li>
{% endfor %}
我的表单.py
from .models import Woman
import django_filters
class SearchWoman(django_filters.FilterSet):
class Meta:
model = Woman
fields = ['city', 'rating']
from django import forms
from .models import Mean
class MeanForm(forms.ModelForm):
class Meta:
model = Mean
fields = ('name',)
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('host_app.urls', namespace='host_app')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我如何尝试重定向(它返回错误“namererror at/search\u results,nazwa”“未定义”)
临时错误(应用第二个视图后)
**编辑:错误代码:**
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/test/
Django Version: 2.1.3
Python Version: 3.7.0
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'host_app',
'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\env\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\env\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = self.process_exception_by_middleware(e, request)
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\env\lib\site-packages\django\core\handlers\base.py" in _get_response
124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\app_rama\host_app\views.py" in test_views
50. return HttpResponseRedirect(reverse('search_results', args=[text]))
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\env\lib\site-packages\django\urls\base.py" in reverse
90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "C:\Users\tymot\Desktop\agencja_modeli_modelek\env\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
622. raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at /test/
Exception Value: Reverse for 'search_results' not found. 'search_results' is not a valid view function or pattern name.
URL应用程序
from django.conf.urls import url
from .import views
app_name = 'host_app'
urlpatterns = [
[...]
url(r'^test/$', views.test_views, name='test_views'),
url(r'^search_results/(?P<text>[\w\-]+)/$', views.search_results, name='search_results')
]
您可以这样尝试将参数发送到下一个视图:
# views
def test_views(request):
form = MeanForm(request.POST)
if form.is_valid():
text = form.cleaned_data['name']
eturn HttpResponseRedirect(reverse('search_result', args=[text]))
else:
text = None
context = { 'form': form, 'text': text, }
return render(request, 'test.html', context)
def search_results(request, text):
search_users = SearchWoman(request.GET, queryset=Woman.objects.all().filter(city=text))
context = { 'search_user': search_users }
return render(request, 'search_results.html', context)
# urls
path('search_result/<str:text>/', search_results, name="search_result")
# urls for django 1.11 or older versions
url(r'^search_result/(?P<text>[\w\-]+)/$',search_results, name="search_result")
#视图
def测试视图(请求):
表单=平均表单(request.POST)
如果form.is_有效():
text=form.cleaned_数据['name']
eturn HttpResponseRedirect(反向('search_result',args=[text]))
其他:
文本=无
上下文={form':form,'text':text,}
返回呈现(请求'test.html',上下文)
def搜索结果(请求、文本):
search\u users=SearchWoman(request.GET,queryset=Woman.objects.all().filter(city=text))
上下文={“搜索用户”:搜索用户}
返回呈现(请求“search_results.html”,上下文)
#网址
路径('search\u result/',search\u results,name=“search\u result”)
#django 1.11或更早版本的URL
url(r'^search\u result/(?P[\w\-]+)/$),search\u results,name=“search\u result”)
因为您使用的是django过滤器,所以将数据放在重定向的查询参数中是有意义的
from django.utils.http import urlencode
from django.urls import reverse
from django.http import HttpResponseRedirect
def test_views(request):
city, rating = 'Springfield', 11 # or get them from a form
query_string = urlencode({'city': city, 'rating': rating})
next_url = '{}?{}'.format(reverse(search_results), query_string)
return HttpResonseRedirect(next_url)
def search_results(request):
search_users = SearchWoman(request.GET)
# when redirected, the url and request.GET contains data from previous view
return render(request, 'search_results.html', {'search_users': search_users})
传递数据的另一种方法是使用会话对象。这要求django的会话中间件处于活动状态,并且客户端使用cookie。两者都是标准的,所以对于一个典型的web站点来说应该可以很好地工作
from django.urls import reverse
from django.http import HttpResponseRedirect
def test_views(request):
city = 'Springfield'
request.session['city'] = city # set session['city']
return HttpResonseRedirect(reverse(search_results)
def search_results(request):
city = request.session.get('city') # get session['city']
data = request.GET.dict() # get url query parameters if any
if city:
data['city'] = city
search_users = SearchWoman(data)
return render(request, 'search_results.html', {'search_users': search_users})
会话很容易使用。如果您想了解更多有关会话如何工作的信息,请阅读django文档的这一部分:请包含错误的完整回溯。您在哪里使用nazwa?你是说
text
?您可以通过在url中将其作为查询参数https://example.com/search_results/?text=foobar
或将值存储在会话对象中<代码>请求。会话['text']='foobar'是的,我指的是文本,很抱歉弄错了。错误的完整描述现在添加到主注释中。文档看起来很有趣,谢谢您的回答。但到目前为止,我从模板中得到了一个错误未找到“/search_results/”的/test/Reverse处的NoReverseMatch/search_results/'不是有效的视图函数或模式名称。`My files after changes在下面的注释中。我写错什么了吗?在url中,有一个名为name
的参数,resolve实际上使用它来反向查找实际的url路径。因此,首先需要在视图和URL中更新它。如果仍然反向抛出一个问题,那么请发布原始问题的回溯。我尝试实现您的解决方案,但模板仍然返回相同的错误(在搜索引擎中输入值后)。以上错误的完整描述。请查看我的答案,我已经更新了视图代码。一切正常。非常感谢您的帮助。谢谢,您的答案非常有用,但是如何将其用于复选框?我们有CITI类,并且在中间定义了“DEF STR(自):返回自我。NAMEI城市”,我们可以在“/admin”中看到:伦敦、华沙、布拉格等。在VIEW。PY城市=“伦敦”中设置之后,重定向没有输入到Django过滤器中。我们只能看到“选择一个有效的选项”。这个选择不是一个可用的选择。如何正确地与之关联?我是否在models.py中定义了其他内容?您必须确保传入表单的数据有效。例如,在我的回答中,我使用字符串表示“city”,但如果city是外键字段,则必须使用city的id。
# views
def test_views(request):
form = MeanForm(request.POST)
if form.is_valid():
text = form.cleaned_data['name']
eturn HttpResponseRedirect(reverse('search_result', args=[text]))
else:
text = None
context = { 'form': form, 'text': text, }
return render(request, 'test.html', context)
def search_results(request, text):
search_users = SearchWoman(request.GET, queryset=Woman.objects.all().filter(city=text))
context = { 'search_user': search_users }
return render(request, 'search_results.html', context)
# urls
path('search_result/<str:text>/', search_results, name="search_result")
# urls for django 1.11 or older versions
url(r'^search_result/(?P<text>[\w\-]+)/$',search_results, name="search_result")
from django.utils.http import urlencode
from django.urls import reverse
from django.http import HttpResponseRedirect
def test_views(request):
city, rating = 'Springfield', 11 # or get them from a form
query_string = urlencode({'city': city, 'rating': rating})
next_url = '{}?{}'.format(reverse(search_results), query_string)
return HttpResonseRedirect(next_url)
def search_results(request):
search_users = SearchWoman(request.GET)
# when redirected, the url and request.GET contains data from previous view
return render(request, 'search_results.html', {'search_users': search_users})
from django.urls import reverse
from django.http import HttpResponseRedirect
def test_views(request):
city = 'Springfield'
request.session['city'] = city # set session['city']
return HttpResonseRedirect(reverse(search_results)
def search_results(request):
city = request.session.get('city') # get session['city']
data = request.GET.dict() # get url query parameters if any
if city:
data['city'] = city
search_users = SearchWoman(data)
return render(request, 'search_results.html', {'search_users': search_users})