如何在Django中使用带问号的URL执行查询?

如何在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

看起来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'),]
现在的问题是,如果我访问,它将跳过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 …