ValueError: Представление blog.views.post_search не вернуло объект HttpResponse. Вместо этого оно вернуло None

Я реализую "функцию поиска" в своем django блоге, используя Solr и Haystack. В "http://127.0.0.1:8000/blog/search/" написано TypeError at /blog/search/ post_detail() missing 3 required positional arguments: 'year', 'month', and 'day' Также в "http://localhost:8000/blog/search" написано ValueError at /blog/search Представление blog.views.post_search не вернуло объект HttpResponse. Вместо этого оно вернуло None.

  • blog/forms.py

    from django import forms
    
    class SearchForm(forms.Form):
        query = forms.CharField()

  • blog/search_indexes.py

    from haystack import indexes
    from .models import Post
    
    class PostIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        publish = indexes.DateTimeField(model_attr='publish')
    
        def get_model(self):
            return Post
    
        def index_queryset(self, using=None):
            return self.get_model().published.all()

  • blog/urls.py

    from blog.feeds import LatestPostsFeed
    from django.conf.urls import url
    from django.urls import include, path
    from . import views
    
    app_name = 'blog'
    
    urlpatterns = [
        path('search', views.post_search, name='post_search'),
    ]

  • blog/views.py

    from .forms import SearchForm
    from haystack.query import SearchQuerySet
    
    def post_search(request):
        form = SearchForm()
        if 'query' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                cd = form.cleaned_data
                results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all()
                # count total results
                total_results = results.count()
                return render(request, 'blog/post/search.html', {'form': form, 'cd': cd, 'results': results, 'total_results': total_results})

  • blog/templates/blog/post/search.html

    {% extends "blog/base.html" %}
    
    {% block title %}Search{% endblock %}
    
    {% block content %}
        {% if "query" in request.GET %}
            <h1>Posts containing "{{ cd.query }}"</h1>
            <h3>Found {{ total_results }} result{{ total_results|pluralize}}</h3>
            {% for result in results %}
                {% with post=result.object %}
                    <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
                    {{ post.body|truncatewords:5 }}
                {% endwith %}
            {% empty %}
                <p>There are no results for your query.</p>
            {% endfor %}
            <p><a href="{% url 'blog:post_search' %}">Search again</a></p>
        {% else %}
            <h1>Search for posts</h1>
            <form action="." method="get">
                {{ form.as_p }}
                <input type="submit" value="Search">
            </form>
        {% endif %}
    {% endblock %}

  • blog/templates/search/indexes/blog/post_text.txt

    {{ object.title }}
    {{ object.tags.all|join:", " }}
    {{ object.body }}

Попробуйте сделать это так:

    def post_search(request):
        form = SearchForm()
        if 'query' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                cd = form.cleaned_data
                results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all()
                # count total results
                total_results = results.count()
#Changed some indention Here
        return render(request, 'blog/post/search.html', {'form': form, 'cd': cd, 'results': results, 'total_results': total_results})

Что я изменил :-

Вы передавали return render внутри оператора if, поэтому Django предположили, что return render является частью if starement.

Редактирование-1

Вы передаете "year", "month" and "day" в параметре для get постов согласно year? Я понятия не имею, почему вы передаете их как параметр.

Вы пытаетесь показать определенное сообщение на странице post_detail, но вы не передаете, какое сообщение вы пытаетесь открыть, то есть вы не передаете Post's id, поэтому Django никогда не узнает, какое сообщение вы хотите увидеть.

Вы можете сделать это так :-

urls.py

path('post_detail/<slug:slug>/<int:post_id>/, views.post_detail, name='post_detail'),

views.py

    def post_detail(request, post_id, slug):
        post = get_object_or_404(Post,pk=post_id)
        # List of active comments for this post

        ......
        ..........

Попробуйте удалить parameters "год", "месяц" и "день"

Я внимательно изучил свой код и обнаружил, что ключом к решению ошибки было добавление возврата еще раз.


    def post_search(request):
        form = SearchForm()
        if 'query' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                cd = form.cleaned_data
                results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all()
                # count total results
                total_results = results.count()
            return render(request, 'blog/post/search.html', {'form': form, 'cd': cd, 'results': results, 'total_results': total_results})
        return render(request, 'blog/post/search.html', {'form': form})

добавив "return render(request, 'blog/post/search.html', {'form': form})" после окончания if.

Вернуться на верх