0

根据Django 3 更改日志

RegexPattern,由 使用re_path(),不再返回关键字参数,其None值将传递给缺少的可选命名组的视图。

最近从 Django 2.2 升级到 3.2,之后我遇到了一个问题,我怀疑上面提到的更新日志。

问题是当KeyError访问get_context_data(...)使用re_path().

仅供参考,只是为了验证我回滚到 Django 2.2 并检查视图中的上下文数据,并且可以看到字典中所需的Key设置为self.kwargsNone

有没有办法将具有 None 值的关键字参数返回到Django 3.2中的视图?

4

1 回答 1

0

据我了解,您有一个表单模式,r'(?P<group>pattern)?'即您设置为可选的捕获组,在这种情况下,None如果它不匹配任何内容,通常它会返回。

如果你真的想这样做而不是重构你的代码,你可以通过从源代码 [GitHub]复制来继承RegexPattern和覆盖它:match

from django.urls.conf import _path
from django.urls.resolvers import RegexPattern
from functools import partial


class MyRegexPattern(RegexPattern):
    def match(self, path):
        match = self.regex.search(path)
        if match:
            # If there are any named groups, use those as kwargs, ignoring
            # non-named groups. Otherwise, pass all non-named arguments as
            # positional arguments.
            kwargs = match.groupdict()
            args = () if kwargs else match.groups()
            # Commented line below from source code
            # kwargs = {k: v for k, v in kwargs.items() if v is not None}
            return path[match.end():], args, kwargs
        return None


# Make the re_path function
re_path = partial(_path, Pattern=MyRegexPattern)

而不是使用这种解决方法,尽管更好的解决方案是指定多个 url 模式而不是一个,或者修复您的视图以允许这种情况。

假设你有这样的模式:

re_path(r'^prefix(?P<group>pattern)?suffix/$', views.some_view),

您可以编写两种模式,例如:

re_path(r'^prefix(?P<group>pattern)suffix/$', views.some_view),
re_path(r'^prefixsuffix/$', views.some_view, kwargs={'group': None}),

如果您以前有一个基于函数的视图,例如:

def some_view(request, group):
    ...

只需更改它,使组具有默认值None

def some_view(request, group=None):
    ...

如果在基于类的视图中您正在编写self.kwargs['group']而不是编写self.kwargs.get('group').

于 2021-09-17T15:49:36.463 回答