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.