рдирдорд╕реНрдХрд╛рд░, рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ 1.9 рд╕реЗ 2.0 рддрдХ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред Django рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреНрдпрд╛ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдХрджрдо
рдпрд╣ Django рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 2.0 рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЖрдкрдХреЗ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдореИрдВ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдкреИрдХреЗрдЬ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡реИрд╕реЗ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕рднреА рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред
рджреВрд╕рд░рд╛ рдХрджрдоред рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА urls.py рдХрд╛ рдЕрджреНрдпрддрди рдХрд░рдирд╛
рдЖрдкрдХреЗ рдореБрдЦреНрдп urls.py рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ url рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
django.urls рд╕реЗ re_path, рдкрде рдЖрдпрд╛рдд рдХрд░реЗрдВред
рдФрд░ рд╣рдо рд╕реА url рдХреЛ рдкрде рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред
url(r'^ some/', include('some.urls')),
рдпрджрд┐ рдЖрдк рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╕реАрдзреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдирд┐рдпрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
re_path(r'^app/$', App.as_view(), name='app')
рдкреНрд▓рдЧ-рдЗрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ / urls.py), urls.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
re_path(r'^create/$', Create.as_view(), name='create')
рдпрджрд┐ рдЖрдк рд╕рдорд╛рд╡реЗрд╢рди рдХреЗ рджреМрд░рд╛рди url рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рд╕реАрдзреЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рд╣рдо рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ urls.py рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ urlpatterns = [] рд╕реЗ рдКрдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
app_name = 'app-application'
рдпрд╣ рд▓рд╛рдЗрди рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп urls.py рдХреЛ рдЕрдзрд┐рдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдкрдардиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдПред
рддреАрд╕рд░рд╛ рдХрджрдо
рд╣рдо рдЖрдкрдХреЗ рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЙрдЯрдХреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХрддрд╛ред
рд╣рдо рдЗрд╕рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░рддреЗ рд╣реИрдВ:
is_authenticated()
рдФрд░
is_authenticated
рдмрджрд▓реЗрдВред рдЕрдм рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧреАред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдЧреЗ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ:
from django.core.urlresolvers import reverse
рдФрд░ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ:
from django.urls import reverse
рдЪреМрдерд╛ рдЪрд░рдг
рдЕрдм рд╕рднреА рдореЙрдбрд▓реЛрдВ рдореЗрдВ редoreignKey, рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реНрдерд┐рддрд┐ рддрд░реНрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП "on_delete" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
on_delete=models.CASCADE on_delete=models.DO_NOTHING on_delete=models.SET_NULL
рдЕрдЧрд▓рд╛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:
python manage.py makemigrations python manage.py migrate
рдкрд╛рдВрдЪрд╡рд╛рдВ рдЪрд░рдг
рдпрджрд┐ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк 127.0.0.1:8000 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рддреБрд░рдВрдд рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ред
рддреНрд░реБрдЯрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:
AttributeError at / 'WSGIRequest' object has no attribute 'user'
рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ MIDDLEWARE_CLASSES рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ MIDDLEWARE рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
django.core.exceptions.ImproperlyConfigured: WSGI application 'application' could not be loaded; Error importing module: 'application doesn't look like a module path
рдпрд╣ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреБрд░рд╛рдирд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware'
рдЫрдард╛ рдЪрд░рдг
рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдорд┐рдбрд▓рд╡реЗрдпрд░рдорд┐рдХреНрд╕рд┐рди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ (рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдЖрдпрд╛рдд:
from django.utils.deprecation import MiddlewareMixin
рд╡рд╣ рд╕рдм рд╣реИ! :)
рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдФрд░ рдЖрдк рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдВрд╕реЛрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдФрд░ рдЙрдЪрд┐рдд рдореЛрдб рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдореБрдЦреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ, рдЬреЛ Django 1.9 рдХреЗ рд╕рд╛рде рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ (рдХреБрдЫ рдмрд┐рдВрджреБ Django рд╕рдВрд╕реНрдХрд░рдг 1.11 рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ), рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ Django 2.0 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЦреЛрдЬ рдХреЗ рд╕рдордп рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рдиред