Django:如何解码URL以获取变量值?

时间:2018-10-24 09:06:39

标签: python django django-urls

我正在尝试做django api。

这是urls.py中的代码

url(r'^edit/(?P<name>[\w-]+)/$', UpdateView.as_view(), name="update")

views.py

class UpdateView(RetrieveUpdateView):
     queryset = Book.objects.all()
     serializer_class = BookUpdateSerializer
     lookup_field = "name"

name变量可能包含'|'符号。

当我在浏览器中打开URL 127.0.0.1:8000/api/edit/ABCD|1234时,其中ABCD|1234是变量name,该URL将自动对其进行编码,并变成127.0.0.1:8000/api/edit/ABCD%7C1234

它无法从我的数据库中找到此名称。 如何解码并从数据库中检索数据?

1 个答案:

答案 0 :(得分:3)

Django将为您解码URL。当您访问self.kwargs['name']时,它将是'ABCD|1234',而不是'ABCD%7C1234'

但是,您有一个单独的问题。您当前的正则表达式组[\w-]+仅匹配大写字母A-Z,小写字母a-z,数字0-9,下划线_和连字符-。如果要匹配|之类的字符,则必须更改此设置。

您只需将|添加到组中即可:

# put | before - otherwise you have to escape hypen with \-
url(r'^edit/(?P<name>[\w|-]+)/$', UpdateView.as_view(), name="update")

或者,如果您要添加到群组中的其他字符很多,则可以将除正斜杠之外的任何内容都匹配为:

url(r'^edit/(?P<name>[^/]+)/$', UpdateView.as_view(), name="update")