Перенаправление пользовательских значений из одного шаблона в другой - Django - PullRequest
0 голосов
/ 10 ноября 2018

Попытка перенаправить значения, заданные пользователем, с одной страницы на следующую. Все может быть сделано в одном представлении, но когда я пытаюсь перенаправить на следующее, используя HttpResponseRedirect, Django возвращает ошибку «NameError в / search_results, имя« не определено ». Как передать значение «текст» из одного представления в другое (в мои результаты поиска)

My views.py (работает хорошо, значения, данные пользователем в одном поле, возвращают соответствующие результаты лечения из django-фильтров)

def test_views(request):
    form = MeanForm(request.POST)
    if form.is_valid():
        text = form.cleaned_data['name']
    else:
        text = None
    search_users = SearchWoman(request.GET, queryset=Woman.objects.all().filter(city=text))

    context = { 'form': form, 'text': text, 'filter': search_users }
    return render(request, 'test.html', context)

Мой test.html

<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']

Мои Forms.py

from django import forms
from .models import Mean

class MeanForm(forms.ModelForm):

    class Meta:
        model = Mean
        fields = ('name',)

Как я пытаюсь сделать редирект (возвращает ошибку «NameError at / search_results, nazwa» «не определено»)

def test_views(request):
    form = MeanForm(request.POST)
    if form.is_valid():
        text = form.cleaned_data['name']
        return HttpResponseRedirect('/search_results/')
    else:
        text = None

    context = { 'form': form, 'text': text, }
    return render(request, 'test.html', context)

def search_results(request):
    search_users = SearchWoman(request.GET, queryset=Woman.objects.all().filter(city=text))
    context = { 'search_user': search_users }
    return render(request, 'search_results.html', context)

Ошибка Tempaltes (после применения второго представления)

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/search_results/

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 search_results
  59.     search_users = SearchWoman(request.GET, queryset=Woman.objects.all().filter(city=text))

Exception Type: NameError at /search_results/
Exception Value: name 'text' is not defined

** РЕДАКТИРОВАТЬ: код ошибки: **

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.

Приложение URLS

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')
]

URL Rama (рядом с settings.py )

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('host_app.urls', namespace='host_app')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Поскольку вы используете 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 было активным, а клиент использовал куки Оба являются стандартными, поэтому он должен хорошо работать на типичном веб-сайте.

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: Как использовать сессии

0 голосов
/ 10 ноября 2018

Вы можете попытаться сделать это с помощью reverse , чтобы отправить параметры на следующий экран:

# 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")
...