【问题标题】:How to save a django "with" template tag value and reuse it in other templates?如何保存 django “with” 模板标签值并在其他模板中重用它?
【发布时间】:2019-12-01 06:08:35
【问题描述】:

我有一个从 URL 读取值的模板标签。例如 搜索词是癌症。搜索后,出现的下一页将有一个搜索词:癌症。而且我希望值 cancer 出现在我的所有网页中,直到用户进行新的搜索。

我以这种方式工作的页面: Search.html > display.html > explore.html

Search.html 是用户输入他们想要搜索的内容的地方。

我有一个 searchedterms.html,它包含在所有 3 个模板中,并包含要从 URL 读取的 Javascript 代码。

通过使用 JavaScript 代码,我设法在 display.html 中显示搜索词:cancer ,但在 explore.html 中该值为空。我希望能够将“癌症”保存到标签中并在其他模板中使用它。

?conditions=cancer

在 search.html 中:

<input required="" type="text" name="conditions">

在 display.html 中:

{% with searched_terms='searchedterms.html' %}
{% include searched_terms %}
{% endwith %}

在 explore.html 中:

{% with searched_terms='searchedterms.html' %}
{% include searched_terms %}
{% endwith %}

在 searchedterms.html 中:

<div id="searched" class="container"></div>
<script type="text/javascript">
 var urlParams = new URLSearchParams(window.location.search);

  function getUrlParameter(name) {
      name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
      var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
      var results = regex.exec(location.search);
      return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };
  var condition = getUrlParameter('conditions');

  document.getElementById("searched").innerHTML = "Searched Terms: " + condition;

</script>

实际结果:Cancer 出现在 display.html 中,但没有出现在 explore.html 中。当 display.html 刷新时,“癌症”也消失了。

期望的结果:癌症出现在 display.html 和 explore.html 中,直到用户开始新的搜索。

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    我认为Django Inclusion tag 是您正在寻找的。​​p>

    templatetags 中注册您的标签,如下所示:

    @register.inclusion_tag('searchedterms.html')
    def searched_terms(query):
        return {
            'query': query
        }
    

    现在在您的 searchedterms.html 文件中:

    <div>
    your searched query is: {{ query }}  {# display your query here #}
    </div>
    

    对于基于类的视图:

    在您的 Search.html > display.html > explore.html 文件中:

    {% load tags %}
    
    {% block content %}
    
    {% searched_terms view.kwargs.conditions %} {# here you pass your kwargs from url #}
    <div>some of your existing code. </div>
    
    {% endblock %}
    

    view.kwargs.conditions 的工作原理在这里解释Access kwargs from a URL in a Django template

    对于功能视图:
    如果您希望从功能视图中的模板中包含 url kwargs,那么您可以在视图中获取 url kwargs 并将其作为上下文数据传递:

    def search_view(request, **kwargs):
        """
        your existing codes
        """
        context = {'conditions': kwargs.get('conditions')}
        return render(request, 'search.html', context)
    
    

    在模板中使用request从url访问:
    如果您想从模板中的 url 访问数据,那么您还可以使用 request.GETrequest.POST 根据您希望在 Search.html > display 中访问数据的方式.html > explore.html 文件:

    {% load tags %}
    
    {% block content %}
    
    {% searched_terms request.GET.conditions %} {# here you access data from url #}
    <div>some of your existing code. </div>
    
    {% endblock %}
    

    您可以查找 django 文档 HttpRequest objects 以了解您可以通过 request 访问的内容。

    【讨论】:

    • 它是否适用于基于函数的视图?从您发送的链接看来,view.kwargs.conditions 仅适用于基于类的视图。
    • 我认为view.kwargs. 在功能视图中是不可能的,但您可以将上下文数据从功能视图传递给模板return render(request, 'search.html', {'myvar': myvar, 'conditions': kwargs.get('conditions')})
    • 如果您仍在寻找解决方案,那么我认为我更新的答案可能会很方便。
    • 嗨,我试过你的更新答案,但是我得到了这些错误而不是searched_terms received too many positional arguments
    • 在我看来,它按预期工作没有任何问题。希望你可能做错了什么。尝试在模板标签中使用*args 捕获这些参数并打印那些args 以检查这些参数是什么。
    猜你喜欢
    • 2022-11-25
    • 2015-03-28
    • 1970-01-01
    • 2014-03-20
    • 2011-03-27
    • 2011-09-17
    • 2011-08-28
    • 2010-09-20
    • 2018-10-21
    相关资源
    最近更新 更多