【问题标题】:Pass Django template variable in url template tag在 url 模板标签中传递 Django 模板变量
【发布时间】:2021-02-15 11:52:50
【问题描述】:

我对 Django 还是有点陌生​​,一直在试图找出一种将模板变量添加到 Django url 模板标签的方法。

我可以用一个例子更好地解释......

我有一个帮助中心/知识库,目前有文章以及与该文章关联的标签。目标是允许用户点击这些关联的标签,使用被点击的标签在帮助中心执行搜索,并在搜索中返回一组新的文章。

这是我的网址格式:

urlpatterns = [
...
path('search/', views.search, name='search'),
...

]

我的html:

<div id="tags uk-margin-bottom">
    {% for tag in article.tags.all %}
        <a href="{% url 'search' %}" class="badge badge-pill badge-primary">#{{ tag }}</a>
    {% endfor %}
</div>

我的搜索视图功能:

def search(request):
if request.user.is_authenticated:        
    # get all articles
    queryset_list = Article.objects.all()

    if 'search' in request.GET:
        search = request.GET['search']

        if search:

            tags = []
            queryset_list_tags = queryset_list.filter(tags__name__icontains=search).distinct()

            try:
                queryset_list_title = queryset_list.filter(title__icontains=search).distinct()
            except:
                print("Testing - Couldn't grab titles.")

            search_results = queryset_list_tags | queryset_list_title

            # get all tags from query_list_title search
            for title in queryset_list_title:
                article = Article.objects.get(title=title)
                queryset_tags = article.tags.all().values_list('name')
         
                for tag in queryset_tags:
                    # add all tags in queryset to tags list
                    tags.append(tag[0])

            # get all tags from query_list_tags search
            for title in queryset_list_tags:
                z_article = Article.objects.get(title=title)
                z_queryset_tags = z_article.tags.all().values_list('name')
                
            
                for tag in z_queryset_tags:
                    # add all tags in queryset to tags list
                    tags.append(tag[0])

            # remove duplicate tags
            tags = list(dict.fromkeys(tags))
            print(f"tags: {tags}")

    context = {
        'articles': search_results,
        'tags': tags
    }

    return render(request, 'articles/search.html', context)
else:
    return redirect('/')

搜索功能可以让用户在数据库中搜索文章/标签。问题是,我需要在用户单击标签时调用搜索功能,以便 URL 看起来像 /articles/search/?search=thisisatag

我尝试向 url 模式添加第二个参数,如下所示:path('search/&lt;str:tag&gt;', views.search, name='search'), 但这最终会破坏其他任何地方的搜索功能,因为除了这个实例之外,任何地方都不需要第二个参数(除非我误会了)。

我可以在 html 中执行此操作,但未调用我的搜索功能:&lt;a href="/articles/search/?search={{tag}}" class="badge badge-pill badge-primary"&gt;#{{ tag }}&lt;/a&gt;

希望这是有道理的 - 我仍在学习,因此非常感谢任何帮助或建议!

【问题讨论】:

    标签: django django-templates django-urls


    【解决方案1】:

    这样的事情可能会奏效:

    模板.html:

    <a href="{% url 'search' %}?search={{tag}}"> Go to </a>
    

    views.py:

    def search(request):
    
        # unpack GET parameters:
        tag = request.GET['search']
    
        ...
    

    【讨论】:

    • 我不敢相信我没有尝试过这个。这行得通!你太棒了 - 非常感谢你! :D
    猜你喜欢
    • 2019-07-31
    • 2011-03-04
    • 2015-06-22
    • 2012-09-27
    • 2014-03-04
    • 1970-01-01
    • 2017-08-11
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多