我在博客中添加了一个搜索字段,这样人们就可以输入他们想要阅读的博客的名称,然后会出现一个项目列表,点击任何列表项目后,它都会重定向到详细信息视图。然而,在我的情况下,如果我在搜索中放入任何内容,它不会重定向到详细视图,而是将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
此外,也许您应该考虑将DetailView
从blog-list
重命名为blog-detail
或类似的名称。