如何在Django中使用带问号的URL执行查询?
看起来Django3.1中删除了原来的URL查询函数。有人知道如何使用新软件包吗 url.py:如何在Django中使用带问号的URL执行查询?,django,Django,看起来Django3.1中删除了原来的URL查询函数。有人知道如何使用新软件包吗 url.py: urlpatterns = [ re_path(r'^portfolio/(?P<title>[\w-]+)/$' , BlogApp_View.displayPortfolio, name='displayPortfolio'), path('portfolio/', BlogApp_View.selectPortfolio, name='selectPortfolio
urlpatterns = [
re_path(r'^portfolio/(?P<title>[\w-]+)/$' , BlogApp_View.displayPortfolio, name='displayPortfolio'),
path('portfolio/', BlogApp_View.selectPortfolio, name='selectPortfolio'),]
现在的问题是,如果我访问,它将跳过url.py中显示的re_路径。
相反,它走的是路径一
我尝试过str:title方法,但实际上这不是我想要的。我更喜欢使用问号模式来完成查询。问号后面的部分是路径,而不是路径的一部分。因此,这意味着,无论您编写什么模式,您都无法在这一点上进行区分,因为路径模式,无论是
路径
还是重路径
,都不会与带有查询字符串的URL相匹配
因此,您应该编写一个视图,并检查请求。GET
query dict(它是查询字符串的类似词典的表示形式,并查看它是否包含title
的值
因此,您的urlpatterns
看起来像:
urlpatterns = [
path('portfolio/', BlogApp_View.selectPortfolio, name='selectPortfolio'),
]
在视图中,您可以查看它是否包含标题:
def selectPortfolio(request):
if 'title' in request.GET:
# contains a ?title=…
title = request.GET.get('title')
portfolio = Article.objects.filter(
articleType__name__contains='Portfolio',
title=title
)
data = {'portfolio': portfolio}
return render(request, 'some_template.html', data)
else:
# contains no ?title=…
# …
return …
def selectPortfolio(请求):
如果request.GET中有“title”:
#包含?标题=…
title=request.GET.GET('title')
公文包=Article.objects.filter(
articleType\uuuu name\uuuuuu包含class='Portfolio',
头衔
)
数据={'portfolio':portfolio}
返回渲染(请求'some_template.html',数据)
其他:
#不包含?标题=…
# …
return…
questionmakr不是路径的一部分。因此它确实不会触发视图,因为它不是路径的一部分,因此re_path
不会执行此操作。@WillemVanOnsem您的意思是我需要重写模式还是不可能使用问号进行查询?问号后面的部分是查询字符串,是吗s不是路径的一部分,因此您的urlpatterns
无法检测到这一点。您需要在查看请求的视图中编写逻辑。GET
(这是查询字符串的类似词典的表示形式)。感谢您提供的示例,它非常清晰且有效。
def selectPortfolio(request):
if 'title' in request.GET:
# contains a ?title=…
title = request.GET.get('title')
portfolio = Article.objects.filter(
articleType__name__contains='Portfolio',
title=title
)
data = {'portfolio': portfolio}
return render(request, 'some_template.html', data)
else:
# contains no ?title=…
# …
return …