AttributeError:'str'对象没有属性'regex'django 1.9

Posted

技术标签:

【中文标题】AttributeError:\'str\'对象没有属性\'regex\'django 1.9【英文标题】:AttributeError: 'str' object has no attribute 'regex' django 1.9AttributeError:'str'对象没有属性'regex'django 1.9 【发布时间】:2016-04-23 13:16:56 【问题描述】:

我正在使用 django 1.9,我目前正在编码 - 在 Windows 命令提示符中 - python manage.py makemigrations 和错误:

AttributeError: 'str' object has no attribute 'regex'

我尝试过编码:

url(r'^$', 'firstsite.module.views.start', name="home"),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'django.contrib.auth.views.login', 'template_name': 'login.html', name='login'),
url(r'^signup/$', 'exam.views.signup', name='signup'),
url(r'^signup/submit/$', 'exam.views.signup_submit', name='signup_submit')

在 urls.py 中,错误不断出现。

这是我第一次用 django 编码,所以我的专业知识非常有限。先感谢您。

这是整个 urls.py:

from django.conf.urls import patterns, include, url
import django
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = patterns('',
  # Examples:
  # url(r'^$', 'firstsite.views.home', name='home'),
  # url(r'^firstsite/', include('firstsite.foo.urls')),

  # Uncomment the admin/doc line below to enable admin documentation:
  # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

  # Uncomment the next line to enable the admin:
  #url(r'^admin/', include(admin.site.urls)),

  django.conf.urls.handler400,

  url(r'^$', 'firstsite.module.views.start', name="home"),
  url(r'^admin/', include(admin.site.urls)),
  url(r'^$', 'django.contrib.auth.views.login', 'template_name': 'login.html', name='login'),
  url(r'^signup/$', 'exam.views.signup', name='signup'),
  url(r'^signup/submit/$', 'exam.views.signup_submit', name='signup_submit'),
  )

【问题讨论】:

你能显示完整的回溯,然后我们可以帮助你吗? 请同时显示整个 urls.py。问题可能是您定义urlpatterns 的方式,而不是单个url() 真的在你的网址中间有这个django.conf.urls.handler400 行吗???如果是,请删除它,view 不是 url... 另请注意,您将获得RemovedInDjango110Warning: Support for string view arguments to url() is deprecated and will be removed in Django 1.10 (got django.contrib.auth.views.login). Pass the callable instead. url(r'^$', 'django.contrib.auth.views.login', name="login")。请改用from django.contrib import authauth.views.login 【参考方案1】:

还要确保删除开头的空 url 模式——在迁移你的 url 时可能会被忽略。

urlpatterns = ['', # <== this blank element ('') produces the error.
    ...
]

tl;博士

出于好奇,我通过在django.core.checks.urls 模块中的check_pattern_startswith_slash 方法中添加警告发现了这一点:

def check_pattern_startswith_slash(pattern):
    """
    Check that the pattern does not begin with a forward slash.
    """
    if not hasattr(pattern, 'regex'):
        warning = Warning(
            "Invalid pattern '%s'" % pattern,
            id="urls.W002",
        )
        return [warning]

而且,果然,我收到了一堆这样的警告:

?: (urls.W002) Invalid pattern ''

【讨论】:

Django 1.10 将检查urlpatterns 中的无效对象,如果发现任何对象,则会显示警告。见ticket 26440。感谢您的想法!【参考方案2】:

首先,删除 urlpatterns 中间的django.conf.urls.handler400。它不属于那里,是错误的原因。

修复错误后,您可以进行一些更改以更新 Django 1.8+ 的代码

    urlpatterns更改为列表,而不是使用patterns()

    导入视图(或视图模块),而不是在 urls() 中使用字符串

    您对startlogin 视图使用相同的正则表达式。这意味着您将无法访问登录视图。一种解决方法是将登录视图的正则表达式更改为 ^login/$

把它们放在一起,你会得到类似的东西:

from firstsite.module.views import start
from exam import views as exam_views
from django.contrib.auth import views as auth_views

urlpatterns = [
  url(r'^$', start, name="home"),
  url(r'^admin/', include(admin.site.urls)),
  url(r'^login/$', auth_views.login, 'template_name': 'login.html', name='login'),
  url(r'^signup/$', exam_views.signup, name='signup'),
  url(r'^signup/submit/$', exam_views.signup_submit, name='signup_submit'),
]

【讨论】:

OP 可能也想修复相同的根模式。 谢谢@DanielRoseman,我没有发现。我已经更新了答案。 您的问题中有'exam.views.signup',因此您的项目中应该有一个应用程序exam,其中包含一个__init__.py 文件。你?为了让我们能够为您提供帮助,您可能需要更新您的问题以包含您项目的文件布局。 感谢@Alasdair 的帮助。但是 firstsite.module 是什么意思?一个错误不断出现没有名为“firstsite.module”的模块。 再次,这是基于您问题中的 urls.py 。你有'firstsite.module.views.start',这表明你在firstsite/module 目录中有一个views.py【参考方案3】:

删除开头的空Url模式和 也删除

django.conf.urls.handler400,    

来自您的urls.py,这将解决您的问题。

【讨论】:

【参考方案4】:

对于 Django 2

from django.urls.resolvers import get_resolver, URLPattern, URLResolver

urls = get_resolver()

def if_none(value):
    if value:
        return value
    return ''

def print_urls(urls, parent_pattern=None):
    for url in urls.url_patterns:
        if isinstance(url, URLResolver):
            print_urls(url, if_none(parent_pattern) + if_none(str(url.pattern)))
        elif isinstance(url, URLPattern):
            print(f"url (url.lookup_str)")
            print('----')
print_urls(urls)

【讨论】:

以上是关于AttributeError:'str'对象没有属性'regex'django 1.9的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy“AttributeError:'str'对象没有属性'c'”

AttributeError 'str' 对象没有属性 'path'

Django 2.2 + AttributeError:'str'对象没有属性'decode'

为啥我得到 AttributeError:'str' 对象没有属性 'strftime'?

AttributeError:'str'对象在构建逻辑回归模型时没有属性'decode'[重复]

Django-channels:AttributeError:'str'对象没有属性'profile'