Django - 如何将多个参数传递给URL

5

我创建了一个列表页面,可以搜索所有的列表项。从那里,用户可以点击任何特定的列表项来查看更详细的信息。当我进入单个列表页时,我会显示面包屑,以提供返回搜索结果(即之前的列表页)的选项。

问题在于,当我从列表页面调用单个列表页时,我无法传递两个参数(其中一个包含之前的URL,以便我可以将其用于面包屑返回到搜索结果)。请参见主要代码:

views.py

def listing(request, listing_id, query):
  listing = get_object_or_404(Listing, pk=listing_id)
  

  context = {
    'listing': listing,
    'query':query
  }

  return render(request, 'listings/listing.html', context)

HTML 模板

{% url 'listing' listing_id=listing.id path=12 %}

我尝试使用{{ request.get_full_path }}来查找路径并将其添加到参数中,但无效。 欢迎提供捕获URL的任何建议。

3个回答

4

以下是您可以处理的内容:

{% url 'listing' listing_id=listing.id path=<b>request.get_full_path</b> %}

但这时候路径必须接受这一点,所以它看起来会像这样:

path('foo/<int:listing_id>/<b><path:path></b>/', …)

它看起来相当混乱,特别是它会对各种问号和和号进行百分比编码。

可能一个更加简洁的解决方案是将其编码在查询字符串中,这样它看起来就像:

path('foo/<int:listing_id>/', …)

视图如下:

def listing(request, listing_id):
  listing = get_object_or_404(Listing, pk=listing_id)
  

  context = {
    'listing': listing,
    'query': <b>request.GET.get('query')</b>
  }

  return render(request, 'listings/listing.html', context)

我们使用以下代码将链接呈现到清单页面:

{% url 'listing' listing_id=listing.id %}<b>?query={{ request.get_full_path|urlencode }}</b>

然而,在URL中编码整个路径看起来并不美观。如果您有一个搜索页面,可以尝试仅编码搜索查询本身(因此不是路径,而是用户在搜索栏中输入的内容)。这会使URL更短,视觉上更加愉悦。


@CharanjitKaur:只需查看您检索的路径,因此通过path或(第二种情况中的request.GET.get('query')),并根据该路径确定面包屑。 - Willem Van Onsem
谢谢。现在它已经运行了。唯一的问题是URL看起来太长了。当我传递2个参数<a href="{% url 'listing' path=request.get_full_path listing_id=listing.id %}时,它要求我将path和listing_id都添加到URL中。URL文件看起来像“path('listing/int:listing_id/path:path', views.listing, name='listing')”。Views.py看起来像“def listing(request,path,listing_id):”。有没有办法仍然使用path变量进行传递,然后我可以在views.py中将其作为上下文传递给列表页面,但我不必在我的urls.py文件中添加path? - Charanjit Kaur
@CharanjitKaur:是的,可能最好将其添加到会话或cookie中,而不是通过URL。https://docs.djangoproject.com/en/3.1/topics/http/sessions/ - Willem Van Onsem
再次感谢您的帮助。 - Charanjit Kaur
你好,能否请您也看一下以下的查询并提供建议?https://stackoverflow.com/questions/65404630/django-how-to-pass-multiple-selected-values-from-selectpicker-from-template-to - Charanjit Kaur

2

在你的urls.py中尝试以下代码:

urlpatterns = [
    path('listing/<int:pk>/<int:path>/', views.listing, name='listing')
]

我认为这个想法不是传递12(如果我理解正确的话,这只是一个占位符),而是将链接来自的页面的整个路径编码到URL中。 - Willem Van Onsem
为什么不直接获取列表的类别并在HTML中添加一个URL呢?如果我理解正确,必须有一个类别或用户拥有这些列表,那么您可以使用该对象的ForeignKey并在HTML中显示到其所有相关列表的链接,例如<a href={% url 'category' listing.category.pk %}>{{category.name</a>}} - SLDem
因为显然这是一个搜索页面,而且原帖作者想要编码"搜索查询"。我认为这也不是很优雅。但是,如果链接在/search?q=foo/othersearch?que=bar上显示,那么我们会在新的URL中"编码"它。 - Willem Van Onsem

0
request.GET.getlist("get_full_path []", [])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接