Как осуществлять поиск с помощью queryset на Django

У меня есть модель Topic и модель Post.

Я хочу осуществлять поиск с помощью queryset. Когда q имеет строку, он работает хорошо, но когда q = '' (что означает All ), он не показывает все сообщения.

Как я могу это исправить?

Весь код здесь

models.py

class Topic(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    topic = models.ForeignKey(Topic,on_delete=models.SET_NULL,null=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail',kwargs={'pk':self.pk})

views.py

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

    def get_context_data(self, **kwargs):
        context = super(PostListView, self).get_context_data(**kwargs)
        context["topics"] = Topic.objects.all() 
        return context

    def get_queryset(self):
        if self.request.GET.get('q') != None:
            q = self.request.GET.get('q')
        else:
            q = ''
        # q = self.request.GET.get('q') if self.request.GET.get('q') != None else ''
        
        return Post.objects.filter(topic__name__icontains=q).order_by('-date_posted')

Вы проверяете истинность и возвращаете Post.objects.none() в случае, если q имеет истинность False:

def get_queryset(self):
    q = self.request.GET.get('q')
    if q:
        return Post.objects.filter(topic__name__icontains=q).order_by('-date_posted')
    else:
        return Post.objects.none()

Можно изменить метод get_queryset в вашем PostListView на:

def get_queryset(self):
    q_param = self.request.GET.get('q')

    if q_param:
        return Post.objects.filter(topic__name__icontains=q_param).order_by('-date_posted')

    # if q is empty this will return all objects
    return Post.objects.all().order_by('-date_posted')

решает вашу проблему.

попробуйте этот

        q = request.GET.get('search')
        if q is not None and q != u"":
            q = request.GET.get('search')
            Post.objects.filter(topic__name__icontains=q).order_by('date_posted')
        else: 
            Post.objects.all().order_by('date_posted')
Вернуться на верх