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'),
  )

Ответ 1

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

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

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

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

  • Вы используете одно и то же регулярное выражение для представлений 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'),
]

Ответ 2

Также не забудьте удалить начальный пустой шаблон 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 ''

Ответ 3

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

django.conf.urls.handler400,    

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