Django:修改后的查询列表的上下文

时间:2018-04-04 12:06:20

标签: django django-views

我有一个包含博客风格文档的数据库,即作者的姓名,出版日期,正文等。

我已经构建了一个django框架,可以根据搜索词输出数据库中的条目。那部分还可以。问题是我想显示正文文本的部分,突出显示匹配的搜索词(相当于谷歌搜索结果)。这意味着我无法仅使用body_text属性创建模板标记,因为该文本未突出显示。我已经做了一个函数,它接收查询和正文文本作为输入,并输出相同的文本,其中找到的搜索项以粗体显示。 我现在的问题是如何将此结果传递给html模板?

使用Django文档中的tutorial假设您有以下views.py:

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

和通讯员模板:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

现在假设你在views.py中有这个功能:

def signal_tokens(text,query_q):
    ...
    return new_text

{{ question.question_text }替换为signal_tokens的输出的最佳方法是什么?我的解决方案是使用字典列表复制上下文变量,其中每个字典都是每个条目的副本,'question_text'键除外,我使用signal_tokens结果:

def index(request):
    query_q = 'test'
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    new_context = []
    for entry in latest_question_list:
        temp_d = {}
        temp_d['id'] =  entry.id
        temp_d['question_text'] = signal_tokens(entry.question_text,query_q)
        new_context.append(temp_d)
    context = {'latest_question_list': new_context}
    return render(request, 'polls/index.html', context)

但问题是我需要复制所有条目。有没有更优雅的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

这是template filter的理想用例。将高亮显示代码移动到templatetags目录中的文件,将其注册为过滤器,然后您可以从模板中调用它:

{{ question.question_text|highlight:query_q }}

显然,您还需要将query_q传递给模板上下文。