AttributeError: объект «str» не имеет атрибута «regex» django 1.9

Я работаю с django 1.9, и в настоящее время я кодирую - в командной строке Windows - python manage.py makemigrations и ошибка:

AttributeError: объект 'str' не имеет атрибута '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'),
  )

person Hannah Wight    schedule 18.01.2016    source источник
comment
Можете ли вы показать полную трассировку, тогда мы сможем вам помочь?   -  person Zagorodniy Olexiy    schedule 18.01.2016
comment
Пожалуйста, покажите также весь urls.py. Проблема может заключаться в том, как вы определяете urlpatterns, а не в отдельном url().   -  person Alasdair    schedule 18.01.2016
comment
У вас действительно есть эта строка django.conf.urls.handler400 в середине ваших URL??? Если да, удалите его, view не url...   -  person bruno desthuilliers    schedule 18.01.2016
comment
Также обратите внимание, что вы получите 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 auth и auth.views.login.   -  person SaeX    schedule 18.01.2016


Ответы (4)


Также не забудьте удалить начальный пустой шаблон URL-адреса — его можно не заметить при переносе URL-адресов.

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

tl;dr

Для любопытных, я выяснил это, добавив предупреждение к методу check_pattern_startswith_slash в модуле django.core.checks.urls:

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 ''
person i41    schedule 08.03.2016
comment
Django 1.10 проверит недопустимые объекты в urlpatterns и отобразит предупреждение, если найдет их. См. тикет 26440. Спасибо за идею! - person Alasdair; 03.05.2016

Во-первых, удалите django.conf.urls.handler400 из середины шаблонов URL. Ему там не место, и оно является причиной ошибки.

Как только ошибка будет исправлена, вы можете внести пару изменений, чтобы обновить свой код для Django 1.8+.

  1. Измените urlpatterns на список вместо использования patterns()

  2. Импортируйте представления (или модули представлений) вместо использования строк в urls()

  3. Вы используете одно и то же регулярное выражение для представлений start и login. Это означает, что вы не сможете получить доступ к представлениям входа. Одним из исправлений было бы изменить регулярное выражение для представления входа в систему на что-то вроде ^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'),
]
person Alasdair    schedule 18.01.2016
comment
OP также может захотеть исправить идентичные корневые шаблоны. - person Daniel Roseman; 18.01.2016
comment
Спасибо @DanielRoseman, я этого не заметил. Я обновил ответ. - person Alasdair; 18.01.2016
comment
В вашем вопросе было 'exam.views.signup', поэтому в вашем проекте должно быть приложение exam, содержащее файл __init__.py. Ты? Чтобы мы могли помочь вам, вам может потребоваться обновить свой вопрос, чтобы включить макет файла вашего проекта. - person Alasdair; 18.01.2016
comment
Спасибо @Alasdair за помощь. Однако что означает firstsite.module? Ошибка продолжает появляться без модуля с именем «firstsite.module». - person Hannah Wight; 18.01.2016
comment
Опять же, это основано на urls.py в вашем вопросе. У вас был 'firstsite.module.views.start', что говорит о том, что у вас есть views.py внутри каталога firstsite/module. - person Alasdair; 18.01.2016

Удалите начальные пустые шаблоны Url, а также удалите

django.conf.urls.handler400,    

из вашего urls.py это решит вашу проблему.

person Emil George James    schedule 17.05.2016

Для Джанго 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)
person Ysrninja    schedule 12.03.2020