Django страница поиска - PullRequest
       0

Django страница поиска

0 голосов
/ 27 января 2020

Я пытаюсь создать сайт, который позволяет посетителям искать книги с помощью другой поисковой системы. У меня есть скрипт, который принимает запрос и возвращает HTML с результатами поиска, но я изо всех сил пытаюсь сделать для этого фронт-энд. Я использую django, потому что это выглядело как лучший вариант, когда я начинал, но сейчас я хожу по кругу и не могу понять, как это сделать - я просто ошеломлен, потому что разные учебники и документация Я читаю все go в расширенный материал, прежде чем смогу заставить работать базовый c.

Нужны ли отдельные шаблоны поиска и результатов? Прямо сейчас я получаю сообщение об ошибке The view book_search.views.search didn't return an HttpResponse object. It returned None instead. Как я могу исправить эту ошибку и / или спроектировать все это лучше?

Вот что у меня есть (скрипт, который возвращает результаты в html, pull.py): представления и URL-адреса находятся внутри приложения book_search.

views.py:

from django.shortcuts import render
from django.http import HttpResponse
from . import pull
from .forms import SearchForm

def index(request):
    return HttpResponse("Welcome to the index page")

def test_search(request):
    context = {'query': 'test query'}
    return render(request, 'book_search/search.html', context)
def search(request):
    if request.method == "GET":
        form = SearchForm(request.GET)
        if form.is_valid():
            query = form.cleaned_data['query']
            results = pull.main(query)
            context = {'query': query, 'form': form, 'results': results}
    return render(request, 'book_search/results.html', context)

apps.py:

from django.apps import AppConfig

class BookSearchConfig(AppConfig):
    name = 'book_search'

urls. py:

from django.urls import path
from . import views

urlpatterns = [
    path('index', views.index, name='index'),
    path('test', views.test_search, name='test_search'),
    path('', views.search, name='search'),
]

forms.py:


class SearchForm(forms.Form):
    query = forms.CharField(label='Search', max_length=200)

база шаблона. html:

<html>
    <head>
    </head>
    <body>
        <form method="GET" action="/search/">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit">
        </form>

        {% block content %}{% endblock %}
    </body>
</html>

результаты шаблона. html:


{% block content %}
    {% results %}
{% endblock content %}

1 Ответ

0 голосов
/ 27 января 2020

Так как мы догадались, что форма недействительна (потому что нет обработчика POST - вы ничего не отправляете в форму) и неправильный отступ дает None ответ, теперь вы можете исправить reference before assignment:

def search(request):
    if request.method == "GET":
        form = SearchForm()
        context = {'form': form}
    elif request.method == "POST":
        form = SearchForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data['query']
            results = pull.main(query)
            context = {'query': query, 'form': form, 'results': results}
    return render(request, 'book_search/results.html', context)

и отображать ошибки в результатах. html шаблон, поставив это:

 {% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...