【问题标题】:Django search / filter across multiple models跨多个模型的 Django 搜索/过滤
【发布时间】:2020-12-14 19:08:48
【问题描述】:

在我的 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 %}

【问题讨论】:

  • 为什么要将默认管理器 (objects) 设置为 None
  • 我没有为这个模型设置一个经理。在这种情况下我需要一个经理吗?在我们网站的其他页面中,我没有使用过滤功能,我仍然可以调用该对象...
  • 不确定“调用对象”是什么意思,但您必须有一个管理器才能使用大多数 ORM 功能。 Django 为您提供了一个名为objects 的默认管理器。你为什么首先将它设置为None

标签: python django web search filter


【解决方案1】:

我最终没有在 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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2011-01-03
    • 1970-01-01
    • 2011-10-24
    • 2018-04-12
    • 2014-06-20
    相关资源
    最近更新 更多