Необходимо добавить функцию поиска в представление на основе классов в Django

У меня есть функция поиска в представлении на основе функций, которая работает нормально. Вот код представления на основе функций:

def BlogList(request):
blogs = Blog.objects.all()
if request.method == 'GET':
    search = request.GET.get('search', '')
    blogs = Blog.objects.filter(blog_title__icontains=search)
return render(request, 'App_Blog/blog_list.html', context={'search':search, 'blogs':blogs})

Но теперь я хочу заменить это представление на основе функций, реализовав его на этом представлении на основе классов.

class BlogList(ListView):
context_object_name = 'blogs'
model = Blog
template_name = 'App_Blog/blog_list.html'

Это мой models.py:

class Blog(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')
blog_title = models.CharField(max_length=264, verbose_name="Put a Title")
slug = models.SlugField(max_length=264, unique=True)
blog_content = models.TextField(verbose_name="What is on your mind?")
blog_image = models.ImageField(upload_to='blog_images', verbose_name="Image")
publish_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)

class Meta:
    ordering = ['-publish_date',]

def __str__(self):
    return self.blog_title

html часть для функции поиска:

<form class="form-inline ml-auto" method="GET">
        <input class="form-control mr-sm-2" type="text" name="search" placeholder="Search the topic">
        <button class="btn btn-success" type="submit">Search</button>
      </form>

Так как я новичок, я пробовал разные решения, но не довел дело до конца. Я буду рад, если кто-нибудь поможет мне в этом.

Вы можете переопределить метод get_queryset внутри вашего ListView.

class BlogList(ListView):
    context_object_name = 'blogs'
    model = Blog
    template_name = 'App_Blog/blog_list.html'

    def get_queryset(self):
        search = self.request.GET.get('search', '') 
        blogs = Blog.objects.filter(blog_title__icontains=search)
        return blogs

Здесь может быть множество функций поиска, таких как, Поиск по автору, названию блога...

Ответ для поиска по заголовку блога,

def search(request):
    title_to_search_by = request.GET.get('search')
    blogs_searched = Blog.objects.filter(blog_title__icontains=title_to_search_by)
    return render(request, 'yourTemplate.html' , {'search_results', blogs_searched})
Вернуться на верх