首页 > 解决方案 > 跨多个模型的 Django 搜索/过滤

问题描述

在我的 Django 网站中,我试图在我的主页上创建一个搜索栏,该搜索栏返回存储在两个不同模型(文章、工作)中的结果

目前,当我使用以下代码进行搜索时,我得到一个空的结果集:

在models.py中,

class Articles(models.Model):
    objects = None

    news_title = models.CharField(db_column="title", max_length=400)
    news_url = models.URLField(db_column="link", max_length=400)
    image_link = models.CharField(db_column="image", max_length=400)
    published_date = models.CharField(db_column="published_date", max_length=400)

    class Meta:
        managed = False
        db_table = "articles"

    def __str__(self):
        return self.news_title


class Jobs(models.Model):
    objects = None

    company = models.CharField(db_column='company', max_length=100)
    job_title = models.CharField(db_column='job_title', max_length=300)
    experience = models.CharField(db_column='experience', max_length=300)
    edu_level = models.CharField(db_column='edu_level', max_length=50)

    class Meta:
        managed = False
        db_table = "job_list"

    def __str__(self):
        return self.job_title

在views.py中,

class SearchView(ListView):
    template_name = 'blog/search_results.html'

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

        articles_results = Articles.objects.filter(Q(news_title__icontains=query))
        jobs_results = Jobs.objects.filter(Q(job_title__icontains=query))

        context={
            'articles':articles_results,
            'jobs':jobs_results,
        }

        return render(request, 'blog/search_results.html', context)

在 main_view.html 中,我使用此代码创建搜索栏:

<form action="{%url 'search_results' %}" method="get" values="{{request.GET.q}}" class="search-jobs-form">
    <div class="row mb-5">
         <input name="q" type="text" values="{{request.GET.q}}" placeholder="search">
    </div>
    <button type="submit">Search</button>
</form>

在 search_results.html 中,

{% block content %}
    {% for job in jobs %}
        <h5>{{job.job_title}}</h5>
        <p>{{job.company}}</p>
    {% endfor %}

    {% for article in articles %}
        <h5>{{article.news_title}}</h5>
        <p>{{article.published_date}}</p>
    {% endfor %}
{% endblock %}

标签: pythondjangowebsearchfilter

解决方案


我最终没有在 views.py 中使用类 SearchView(ListView) 并使其工作

这是我使用的代码

#index.html Search Bar
<form method="get" class="search-jobs-form" action="{% url 'main_search'%}">
    {% csrf_token %}
    <input type="text" placeholder="Job title, Company..." name="search_query">
    <button type="submit" class="btn btn-info btn-lg btn-block text-white btn-search">Search Job</button>
</form>

在意见中,

#views.py
def main_search(request):
    q = request.GET['search_query']

    articles = Articles.objects.filter(news_title__icontains=q)
    jobs = Jobs.objects.filter(Q(job_title__icontains=q) | Q(company__icontains=q))
    return render(request, "blog/main_search.html", {'articles':articles, 'jobs':jobs, 'page_name':'Search Results', 'q':q})

推荐阅读