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,原来的RegexUrlResolverRegexURLPattern的引用就变了,下面是需要修改的地方:

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

参考:https://www.cnblogs.com/Neeo/articles/14036364.html#staticfiles-is-not-a-registered-tag-librarymust-be-one-of

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

程序运行就报错:

其原因是没有注册userinfo模型类:

posted @ 2022-05-23 18:09  听雨危楼  阅读(166)  评论(0编辑  收藏  举报