1-CRM - 问题集
目录
一个bug#
django3.2 + python3.9
一个小bug:
AttributeError: 'ForeignKey' object has no attribute 'rel'#
django3.2 + python3.9
ImportError: cannot import name RegexUrlResolver#
django3.2
在django2版本以上,包括我们用的Django3.2,原来的RegexUrlResolver
和RegexURLPattern
的引用就变了,下面是需要修改的地方:
import re
from collections import OrderedDict
from django.conf import settings
from django.utils.module_loading import import_string
# Django1.x中这么导入
# from django.urls import RegexURLResolver, RegexURLPattern
# Django2开始需要这么导入
from django.urls.resolvers import URLResolver, URLPattern
def check_url_exclude(url):
"""
排除一些特定的URL
:param url:
:return:
"""
for regex in settings.AUTO_DISCOVER_EXCLUDE:
if re.match(regex, url):
return True
def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
"""
递归的去获取URL
:param pre_namespace: namespace前缀,以后用户拼接name
:param pre_url: url前缀,以后用于拼接url
:param urlpatterns: 路由关系列表
:param url_ordered_dict: 用于保存递归中获取的所有路由
:return:
"""
for item in urlpatterns:
# Django1.x中这么写
# if isinstance(item, RegexURLPattern): # 非路由分发,将路由添加到url_ordered_dict
# Django2开始这么写
if isinstance(item, URLPattern): # 非路由分发,将路由添加到url_ordered_dict
if not item.name:
continue
if pre_namespace:
name = "%s:%s" % (pre_namespace, item.name)
else:
name = item.name
# Django1.x中这么写
# url = pre_url + item._regex # /rbac/user/edit/(?P<pk>\d+)/
# Django2以上不支持._regex,改为.pattern.regex.pattern
url = pre_url + item.pattern.regex.pattern # /rbac/user/edit/(?P<pk>\d+)/
url = url.replace('^', '').replace('$', '')
if check_url_exclude(url):
continue
url_ordered_dict[name] = {'name': name, 'url': url}
# Django1.x中这么写
# elif isinstance(item, RegexURLResolver): # 路由分发,递归操作
# Django2开始这么写
elif isinstance(item, URLResolver): # 路由分发,递归操作
if pre_namespace:
if item.namespace: # 如果父级有namespace,name就拼上父级的namespace和自己的namespace
namespace = "%s:%s" % (pre_namespace, item.namespace,)
else:
# 经过分析,下面这行代码写错了
# namespace = item.namespace
# 应该写成下面这样
namespace = pre_namespace # 如果父级有namespace,自己没有namespace,就用父级的namespace即可
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
# Django1.x中这么写
# recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict)
# Django2以上不支持._regex,改为.pattern.regex.pattern
recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict)
def get_all_url_dict():
"""
获取项目中所有的URL(必须有name别名)
:return:
"""
url_ordered_dict = OrderedDict()
md = import_string(settings.ROOT_URLCONF) # from luff.. import urls
recursion_urls(None, '/', md.urlpatterns, url_ordered_dict) # 递归去获取所有的路由
return url_ordered_dict
'staticfiles' is not a registered tag library. Must be one of:#
django3.2 + python3.8
unknown extension ?P( at position 15#
django3.2 + sqlite3 + pthon3.9
AttributeError: type object 'UserInfoHandler' has no attribute '_meta'#
django.1.11.29 + sqlitle3 + python3.6
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步