Django中的搜索字段没有重定向到详细信息视图



我在博客中添加了一个搜索字段,这样人们就可以输入他们想要阅读的博客的名称,然后会出现一个项目列表,点击任何列表项目后,它都会重定向到详细信息视图。然而,在我的情况下,如果我在搜索中放入任何内容,它不会重定向到详细视图,而是将http://127.0.0.1:8000/home/search/2而不是http://127.0.0.1:8000/home/list/2/.

我已经在下面发布了我的模型、视图、URL和模板文件。

我需要在这里使用任何反向方法来重定向吗?我需要对模板文件进行哪些更改?

型号.py

from django.db import models
class Category(models.Model):
cat_name = models.CharField(max_length = 256, blank = True)
def __str__(self):
return self.cat_name

class Blog(models.Model):
name = models.CharField(max_length = 256, blank = True)
pub_date = models.DateTimeField('date published')
text = models.TextField(blank = True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, 
related_name='categories', verbose_name = 'blog_categories')

def __str__(self):
return self.name

views.py

from django.shortcuts import render
from homepage.models import Blog
from django.views.generic import TemplateView, ListView, DetailView
from homepage import models
from django.db.models import Q
class Home(TemplateView):
template_name = 'homepage/index.html'

class BlogListView(ListView):
context_object_name = 'blogs'
model =  models.Blog
template_name = 'homepage/blog_list.html' 

class BlogDetailView(DetailView):
context_object_name = 'blogs_detail'
model =  models.Blog
template_name = 'homepage/blog_detail.html' 
def get_queryset(self):
query = self.request.GET.get('q')
return Blog.objects.filter(
Q(name__icontains = query) | Q(name__icontains = query) )

class SearchResultsListView(ListView):
model = Blog
context_object_name = 'blog_list'
template_name = 'homepage/search_result_list.html'
def get_queryset(self):
query = self.request.GET.get('q')
return Blog.objects.filter(
Q(name__icontains = query) | Q(name__icontains = query) )

urls.py

from django.urls import path
from homepage import views  
from homepage.views import SearchResultsListView
app_name = 'homepage'
urlpatterns = [
path('', views.Home.as_view(), name = 'index'),
path('list/', views.BlogListView.as_view(), name = 'blog-list'),
path('list/<int:pk>/', views.BlogDetailView.as_view(), name = 'blog-list'),
path('search/', SearchResultsListView.as_view(), name = 'search_result'),
]

index.html

<div class="grid-item-1">
<h1>G</h1>
<input type="button" name="" value="Back to Home" placeholder="">
<a href="{% url 'home:index' %}"></a>

<form action="{% url 'home:search_result' %}" method = 'get'>
<input type="text" name="q" placeholder="search">

</form>

</div>

search_result_list.html

{% for blog in blog_list %}
<ul>
<li>
<a href="{{blog.id}}">{{blog.name}}</a>
{{blog.address}}
<a href="{{blog.id}}">here</a> 
</li>
</ul>  

{% endfor %}

URL重定向到http://127.0.0.1:8000/home/search/2这是一个404页。

如何将其重定向到详细信息视图页面http://127.0.0.1:8000/home/list/1/并查看搜索结果所拉列表的详细信息。

发生这种情况的原因是{{ blog.id }}只包含一个数字,例如2。它将被附加到URL中。您可以通过在URL前加上斜线(/(并用写入列表来解决此问题
<a href="/list/{{blog.id}}">{{blog.name}}</a>
{{blog.address}}
<a href="/list/{{blog.id}}">here</a>

但最好使用{% url … %}模板标签[Django-doc]:

<a href="{% 'blog-list' blog.id %}">{{blog.name}}</a>
{{blog.address}}
<a href="{% 'blog-list' blog.id %}">here</a>

在您的BlogDetailView中,没有q参数,因此您可以删除get_queryset:

class BlogDetailView(DetailView):
context_object_name = 'blogs_detail'
model =  models.Blog
template_name = 'homepage/blog_detail.html' 
#noget_queryset

此外,也许您应该考虑将DetailViewblog-list重命名为blog-detail或类似的名称。

相关内容

最新更新