首页 > 解决方案 > 如何按用户输入对 Django 查询进行排序?

问题描述

我有一个 Django 网站,其中包含以下相关模型、视图和模板。我的问题在下面,在相关代码之后(注意这里的代码可能比回答问题所需的代码长)。模型:

class Article(models.Model):
    title = models.CharField(max_length=255)
    comment = models.TextField()
    entry_date_time = models.DateTimeField(default=timezone.now, null=True)

    class Meta:
        ordering = ['-entry_date_time']
    score_choices = [(-5,'-5'), (-4, '-4'), (-3,'-3'), (-2, '-2'), (-1,'-1'), (0,'0'),
    (1,'1'), (2,'2'), (3,'3'), (4,'4'), (5,'5')]
    fundamental_score = models.FloatField(choices=score_choices, default=0)
    equity = models.ForeignKey(Equity, on_delete=models.CASCADE, null=True)

看法:

class ArticleListView(ListView):
    model = Article
    paginate_by = 50
    fields = ('equity', 'entry_date_time', 'fundamental_score', 'sentiment_score', 'source')
    template_name = 'article_list.html'
    context_object_name = 'object_list'
    equity_query=""
    date_query=""
    start_query=""
    industry_query=""
    broker_query="" 
    def get_queryset(self):
        if self.request.method == 'GET':
            if self.request.GET.get('equityQuery') is None:
                self.equity_query = ""
            else:
                self.equity_query = self.request.GET.get('equityQuery')

            if self.request.GET.get('dateQuery') is None:
                self.date_query = ""
            else:
                self.date_query = self.request.GET.get('dateQuery')
            if self.request.GET.get('startQuery') is None:
                self.start_query = ""
            else:
                self.start_query = self.request.GET.get('startQuery')
            
                
            if self.request.GET.get('industryQuery') is None:
                self.industry_query = ""
            else:
                self.industry_query = self.request.GET.get('industryQuery').title()
            
            if self.request.GET.get('brokerQuery') is None: #new
                self.broker_query = "" #new
            else: #new
                self.broker_query = self.request.GET.get('brokerQuery').title() #new 
            self.equity_query = self.equity_query.upper()
            articles_list = Article.objects.filter(Q(equity__equity_name__contains=self.equity_query) & Q(entry_date_time__contains=self.date_query) & Q(equity__industry__contains=self.industry_query) & Q(source__contains=self.broker_query))
            Equity.objects.all().filter(industry=industry)

            return articles_list

模板:

{% extends 'base.html' %}

{%block title %}Entries{% endblock title %}

{% block content %}
<div>
    <form method="GET">
        {% csrf_token %}
        <input type="text" id="equityQuery" name="equityQuery" placeholder="Equity">
        <input type="text" id="dateQuery" name="dateQuery" placeholder="Date (yyyy-mm-dd)">
        <input type="text" id="startQuery" name="startQuery" placeholder="Date (yyyy-mm-dd)">
        <input type="text" id="industryQuery" name="industryQuery" placeholder="Industry">
        <input type="text" id="brokerQuery" name="brokerQuery" placeholder="Broker">
        <input type="submit" value="Submit">
    </form>
</div>
{% for article in object_list %}
<div class="card">
    <div class="card-header">
        <span class="font-weight-bold">{{article.equity.equity_name}}</span>
        <p style="text-align: left;">Title: {{article.title}} <span style="float:right;">Source:
                {{article.source}}</span></p>
        <p style="text-align: left;">Author: {{article.author}}</p>
        <span style="float:right">Date: {{article.get_date}}</span>
        <span class="font-weight-bold">Fundamental: {{article.fundamental_score}}</span> &middot;
        <span class="font-weight-bold">Sentiment: {{article.sentiment_score}}</span>
    </div>
    <div class="card-body">

模板继续,但这是重要的部分。现在,这是为了我有一个网页,上面有关于各种股票的文章列表。我可以在此页面搜索涵盖给定股票、给定日期范围、特定经纪人或特定行业的文章。如果我愿意,我知道如何通过“fundmental_score”字段对查询的结果进行排序。但是,我想要做的是保持排序字段“动态”。换句话说,我希望用户能够输入(或从下拉菜单中选择)我对 Article 模型的哪些字段进行排序。有时它会是日期,有时是“fundamental_score”,也许其他领域不太常见。有没有一种简单的方法可以做到这一点?我对 Django 比较陌生。

标签: pythondjangodjango-modelsdjango-views

解决方案


推荐阅读