【问题标题】:Search view with multiple pages and order by relevancy具有多个页面的搜索视图并按相关性排序
【发布时间】:2017-03-02 10:08:49
【问题描述】:

我正在写一个非常简单的搜索视图:

class SearchView(generic.ListView):
    template_name = 'polls/search.html'
    context_object_name = 'results'

    def get_queryset(self):
        """
        Extract query from parameters and return search results.
        """
        query = self.request.GET.get('query')
        if query:
            query = query.strip()
            return Question.objects.filter(question_text__icontains=query)
        else:
            return Question.objects.none()

<!DOCTYPE html>
{% if results %}
<ul>
    {% for result in results %}
        <li><a href="{% url 'polls:vote' result.id %}">{{ result }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p>No matches found.</p>
{% endif %}
<p><a href="{% url 'polls:index' %}">Back to overview?</a></p>

结果应按选择的总票数排序:

Question.objects.filter(question_text__icontains=query).order_by('choice__votes')

  • 此查询似乎不起作用并多次返回问题。
  • 如何将结果拆分到多个页面上?

【问题讨论】:

  • 相同question object重复多次

标签: html django search


【解决方案1】:

如果你附上你的 Question Django 模型可能会有用,因为我不明白你的错误。

关于分页,以下是我在应用程序中使用的一些有用的 Django 类:

https://docs.djangoproject.com/en/1.10/topics/pagination/

使用起来非常简单。

【讨论】:

  • @R3turnz,由于声誉低,我无法评论您的答案:(您解决了所有问题吗?很高兴帮助您进行分页:)
【解决方案2】:

谢谢!分页正是我想要的。

我想查询一个反向外键关系:

class Question(models.Model):
    question_text = models.CharField('text', max_length=200)
    pub_date = models.DateTimeField('publication date', default=timezone.now)

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField('text', max_length=200)
    votes = models.IntegerField('votes', default=0)

    def __str__(self):
        return self.choice_text

解决方案是使用注释:

results.annotate(total_votes=Sum('choice__votes')).order_by('-total_votes')

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2011-01-26
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多