Django-guardian: user.has_perm("perm", obj) рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рд╕рд┐рддре░ 2011  ┬╖  28рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: django-guardian/django-guardian

рдпрджрд┐ рдореИрдВ рдорд╛рдирдХ user.has_perm("perm") рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ True рд▓реМрдЯрд╛рдПрдЧрд╛, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ "perm" рд╣реИред
рдФрд░ рдпрджрд┐ user.has_perm("perm", obj) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ True рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ False рд▓реМрдЯрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ "perm" рд╣реЛ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рд╣реЛрдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрд░реЗ, рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА _AUTHENTICATION_BACKENDS_ рд╕реЗрдЯрд┐рдВрдЧ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреИрдХрдПрдВрдб рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ:

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

рдпрд╛ рдпрд╣:

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

рдмрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреГрдкрдпрд╛ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдЕрдиреНрдп рдмреИрдХрдПрдВрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдРрдк рдмрдВрджрд░ рдкреИрдЪ рдЬреЛ _User.has_perm_ рд╡рд┐рдзрд┐?)

рд╕рднреА 28 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдорддрд┐ рдмреИрдХрдПрдВрдб рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ user.has_perm рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛, рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рдЬрд╛рдВрдЪ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИред рдореИрдВ Django 1.2.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдЕрд░реЗ, рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА _AUTHENTICATION_BACKENDS_ рд╕реЗрдЯрд┐рдВрдЧ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреИрдХрдПрдВрдб рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ:

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

рдпрд╛ рдпрд╣:

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

рдмрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреГрдкрдпрд╛ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдЕрдиреНрдп рдмреИрдХрдПрдВрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдРрдк рдмрдВрджрд░ рдкреИрдЪ рдЬреЛ _User.has_perm_ рд╡рд┐рдзрд┐?)

рдареАрдХ рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ рдмрд╣реБрдд рдердХ рдЧрдпрд╛ рд╣реВрдБред рдЖрджреЗрд╢ _has_perm_ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдк рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ (_python manage.py test Guardian_) рдЪрд▓рд╛рдХрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рднрд╛рд╡рдХ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдУрд╣, рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдФрд░ рдкрдврд╝рд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ _auth.ModelBackend_ _supports_object_permissions_ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ (рд╡рд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ _False_ рд╣реИ)ред Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рд╡реЗ 1.4 рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред

рддреЛ, рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдХреЛ рдмрд╕ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЙрдкрд╛рдп рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

_invalid_ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирдИ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!

рдареАрдХ рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЧрдВрднреАрд░ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд▓рд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП guardian.decorators.permission_required рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдорд╛рдирд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдЕрдиреБрдорддрд┐ рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп django.contrib.auth.decorators.permission_required рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ permission_required рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ django-guardian рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рд╡рд╛рд▓реЗ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдЦреЛ рджрд┐рдП рдереЗред

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреВрд░реЗ рдХреЛрдб рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдБрдЪ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдБ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдФрд░ рдкреНрд░рддрд┐-рд╡рд╕реНрддреБ рджреЛрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@ рдХреМрдпрдЧреБрд▓рд╛рдВрдЯ : рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Django рдХреЗ рд▓реЗрдЦ рд╕реЗ _extend_ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рдРрдк _рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ_ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реИ, рди рдХрд┐ рдореВрд▓ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛рдиреА рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЕрднрд┐рднрд╛рд╡рдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджрд┐рдП рдЧрдП рдРрдкреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдРрдк рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЕрднрд┐рднрд╛рд╡рдХ рдЙрди рд╕рднреА рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рджреВрд╕рд░реА рдУрд░, рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП - рдХреГрдкрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЗрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд┐рдирд╛ рдмреИрдХрд╡рд░реНрдб рдХреА рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╛рдиреА рдирдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рдЕрдиреБрдорддрд┐_рдЖрд╡рд╢реНрдпрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рджреЛрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдореЗрд░реЗ рдореБрджреНрджреЗ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред

@Dzejkob , рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ (рдореИрдВрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЬреЛрдбрд╝рд╛ рд╣реИ)ред рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рд╕рдЬрд╛рд╡рдЯреА рдкрд░ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдФрд░ рдЙрджрд╛рд╣рд░рдг/рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдиреЛрдЯ: рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдирдИ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реИ: _feature/add-accept_global_perms-flag-for-decorators_

@lukaszb рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЧрд╛рд░реНрдЬрд┐рдпрди рдХрд╛ рдирдпрд╛ рд╢рд╛рдЦрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, permission_required рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ accept_global_perms=True рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЯреНрд░рдВрдХ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╡реЗ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдпрд╣ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣реИрд▓реЛ, рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрд╛рдВрдЧреЛ-рдЕрднрд┐рднрд╛рд╡рдХ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЫреЛрдЯрд╛/рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрд╛ред

рдореИрдВрдиреЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ (рдЪрд▓рд┐рдП рдЗрд╕реЗ view_user рдХрд╣рддреЗ рд╣реИрдВ) рдЬреЛрдбрд╝рд╛ (рдЪрд▓рд┐рдП рдЗрд╕реЗ joe рдХрд╣рддреЗ рд╣реИрдВ) рдФрд░ рдлрд┐рд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпрд╛ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ (рдЪрд▓рд┐рдП рдЗрд╕реЗ other_user рдХрд╣рддреЗ рд╣реИрдВ) ) рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдпрд╣ False рд▓реМрдЯрд╛ред

joe = User.objects.get(username="joe")
other_user = User.objects.get(username="other_user")
assign_perm("myapp.view_user", joe)
joe.has_perm("myapp.view_user") # True as expected
joe.has_perm("myapp.view_user", other_user) # False, whaaaat?

рдЕрдм, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ permission_required рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╡реНрдпреВ рд╕реЗрдЯ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ" рдореЗрд░реЗ REST_FRAMEWORK/DEFAULT_PERMISSION_CLASSES рдФрд░ AUTHENTICATION_BACKENDS settings.py рдореЗрдВ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред . рдореИрдВ рдЕрднрд┐рднрд╛рд╡рдХ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╣реВрдВ?

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╡рдХреВрдл рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ djangoland рдореЗрдВ рджрд┐рди 2/3 рд╣реИ)

рдЖрдЬ рдХреЗ рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк/рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд┐ guardian.shortcuts.get_objects_for_user() рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ/рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ ( accept_global_perms )ред

accept_global_perms: if True takes global permissions into account. 
[...]
Default is True.

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдБ рдмрд╛рддрдЪреАрдд рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЬрдЧрд░ рдХреЗ рдЬрд╝реЗрди рдХрд╣рддреЗ рд╣реИрдВ:

рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рдХреЗрд╡рд▓ рдПрдХ -ред

рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╕реНрдерд╛рдиреАрдп (рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░ _рдлреЙрд▓рдмреИрдХ рдХрд░реЗрдВред рдЖрджреЗрд╢ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ Django returns False if obj is not None ), рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдкреВрд░реЗ рдХреЛрдб рдкрд░ рджреЛрд╣рд░реА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ DRY рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╡рд┐рд░реБрджреНрдз рднреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, Django рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдХреЗ рднреАрддрд░ рдЙрдкрд▓рдмреНрдз рдЕрднрд┐рднрд╛рд╡рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ DRY рднреА рдирд╣реАрдВ рд╣реИред рд╡рд╣ Django рдХрдИ рдмреИрдХрдПрдВрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреНрд░рдо рдореЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдЬрд╛рдВрдЪрдирд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмреИрдХрдПрдВрдб рдХреЛ рдПрдХ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдпрд╣ рд╕рд╣реА рд╣реИ, рддреЛ Django рдЬрдм obj is not None _рдЧрд▓рдд_ рд╣реИ рддреЛ рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ Django рдиреЗ obj рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЪреЗрдХрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝реЙрд▓рдмреИрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Django рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд┐рдХрдЯ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкреВрдЫрддреЗ рд╣реБрдП рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмреИрдХрдПрдВрдб рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Django рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдХрд╛рдлреА рдЕрд╕рдВрднрд╡ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП), рдЗрд╕рд▓рд┐рдП рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЕрднрд┐рднрд╛рд╡рдХ рдХреЛ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ) рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рддреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ _рд╕реНрдерд╛рдиреАрдп рдлрд╝реЙрд▓рдмреИрдХ рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдмреЛрд░реНрдб рднрд░ рдореЗрдВ false_ рд╣реЛред

рдЕрдЧрд░ Django рдПрдХ рддреНрд░рд┐-рд░рд╛рдЬреНрдп рдЕрдиреБрдорддрд┐ рдкреНрд░рдгрд╛рд▓реА рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛: рд╕рдЪ, рдЧрд▓рдд, рдФрд░ рдХреЛрдИ рдирд╣реАрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдЪреЗрдХрд░реНрд╕ False рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЛ _override_ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдФрд░ None рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдХрд╣ рд╕рдХрддрд╛ рд╣реИ: "рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛, рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреВрдЫреЗрдВ"ред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, Django рдмреИрдХрдПрдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ True or False рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢рдХреНрддрд┐ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред

рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдХреЛ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рджреЗрдЧрд╛: рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@doganmeh Django рдПрдХ рддреНрд░рд┐-рд░рд╛рдЬреНрдп рдЕрдиреБрдорддрд┐ рдкреНрд░рдгрд╛рд▓реА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо 1.10 рдХреЗ рд░реВрдк рдореЗрдВ)ред рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рд╣реИрдВ, рдХреЛрдИ рдирд╣реАрдВ, рдФрд░ рдЕрдиреБрдорддрд┐ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ Django рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░реЗрдЧрд╛ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЗрд╕ рдореБрджреНрджреЗ рдХреА рдмрд╛рдд рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ Contrib.Auth рдореБрджреНрджрд╛ рд╣реИред рд╡рд╣ рдмреИрдХрдПрдВрдб рд╣реИ рдЬреЛ 'рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ' рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдореНрдореЗрд▓рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ obj рдХреЗ рд╕рд╛рде has_perm = рдХреЛрдИ рднреА рдХреЗрд╡рд▓ 'рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрдорддрд┐рдпреЛрдВ' рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ obj рдХреЗ рд╕рд╛рде has_perm рдХреЗрд╡рд▓ 'рдкрдВрдХреНрддрд┐ рдЕрдиреБрдорддрд┐рдпрд╛рдВ' рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд░рд╣реЗрдВред

(рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЙрдирдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рджреЛрд╖ рд▓рдЧрддрд╛ рд╣реИред)

'рджреЛрдиреЛрдВ рдЬрд╛рдВрдЪреЗрдВ' рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рд╣реЛрдВрдЧреЗ? рдореИрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдХреНрд╡рд╛рд░реНрдЧ рд╣реИред

рдореИрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рд╕реНрдЯреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд╣рд╛рдВ рдЕрдиреБрдорддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдПрдХ NullBooleanField рд╣реЛрдЧрд╛ред рд╕рдЪ рд╣реИ, рдпрджрд┐ рдЖрдк True (рдпрд╛ рдЕрдиреБрдорддрд┐ рдХреА рдХрдореА) рдХреА рдХрдореА рдХреЛ None рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдЯреНрд░рд┐рд╕реНрдЯреЗрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ None рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдирд┐рд░реНрдгрдп рд╡реИрд╢реНрд╡рд┐рдХ рдХреЛ рд╕реМрдВрдк рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдЬрд╛рдЗрди рд▓реЗрддрд╛ред

@airstandley рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм user.has_perm рдореЗрдВ kwarg рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐:

def has_perm(self, perm, obj=None, fallback=False)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм fallback=True , рдЕрднрд┐рднрд╛рд╡рдХ Django рдмреИрдХрдПрдВрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ Django рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдврд╛рдВрдЪреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рди рдХрд┐ рдЙрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рдЕрдкрд╣рд░рдг рдХрд░рдХреЗред

@doganmeh рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдЧрд▓рдд рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдБред рдЗрд╕реЗ "рд╕рддреНрдп, рдЧрд▓рдд , рдФрд░ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП" рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдирд╣реАрдВ:

рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рд╣реИрдВ, рдХреЛрдИ рдирд╣реАрдВ, рдФрд░ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИ

рдмрд╛рдж рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рднреА рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ

рдЕрдЧрд░ Django рдПрдХ рддреНрд░рд┐-рд░рд╛рдЬреНрдп рдЕрдиреБрдорддрд┐ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рдореЙрдбрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рди рдХрд┐ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ?

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдерд╛ рдХрд┐ рдСрде рдмреИрдХрдПрдВрдб рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╕рдЯреАрдХ рд╢реЙрд░реНрдЯ-рдХрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо has_perm , has_module_perms api рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрджрд┐ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИ:
рдХреЛрдИ рднреА рдмреИрдХрдПрдВрдб рдпрд╛ рддреЛ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ (рд░рд┐рдЯрд░реНрди рдЯреНрд░реВ рдпрд╛ рдкрд░рдорд┐рд╢рди рдЕрд╕реНрд╡реАрдХреГрдд), рдпрд╛ рдирд┐рд░реНрдгрдп рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдЧрд▓реЗ рд╕рдорд░реНрдерд┐рдд (рд░рд┐рдЯрд░реНрди рдЧрд▓рдд) рдХреЛ рд╕реМрдВрдк рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрдгрдп рд╣реИ, рди рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЧреБрдгрд╡рддреНрддрд╛ред

рдПрдХ рд╕реНрдкрд╖реНрдЯ ObjectPermissionBackend рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪреБрдиреВрдВрдЧрд╛ред ("рд╕реНрдкрд╖реНрдЯрддрд╛" рдЕрдиреНрдп рдЕрдиреБрдорддрд┐ рдЬрд╛рдБрдЪ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЛ рдмреЛрдЭрд┐рд▓ рдмрдирд╛ рджреЗрддреА рд╣реИред) рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐, рдЖрдк рдХреА рддрд░рд╣, рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рддреЛ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ 'рд╕реНрдкрд╖реНрдЯрддрд╛' рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@doganmeh
рддреЛ рдХреНрд╡рд╛рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдСрде рдХреЗ рдмреИрдХрдПрдВрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛рдо рдХрд░рдирд╛ рдерд╛ред рддреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛:
рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд░рд╛рджрд╛ рдпрд╣ рдерд╛ рдХрд┐ рдмреИрдХрдПрдВрдб рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрдИ рдРрдк рдСрде рдХреА рдЕрдиреБрдорддрд┐ рдкреНрд░рдгрд╛рд▓реА (рдпрд╛рдиреА 'рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпрд╛рдВ' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╡реЗ 'рдЯреЗрдмрд▓ рдЕрдиреБрдорддрд┐рдпрд╛рдВ' рд╣реЛрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЖрд▓реВ, рдЖрд▓реВ) рдпрд╣ AUTH_BACKENDS рдореЗрдВ рдСрде рдореЙрдбрд▓рдмреИрдХрдПрдВрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╡рд╣ рдРрдк рдЕрднрд┐рднрд╛рд╡рдХ рдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐ рдкреНрд░рдгрд╛рд▓реА (рдпрд╛рдиреА 'рдкрдВрдХреНрддрд┐ рдЕрдиреБрдорддрд┐') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ AUTH_BACKENDS рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐ рдмреИрдХрдПрдВрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
ModelBackend рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ред
рдСрдмреНрдЬреЗрдХреНрдЯрдкреНрд░рдорд┐рд╢рдирдмреИрдХрдПрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ред
рдпрджрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ ModelBackend has_perm рдХреЗ рд▓рд┐рдП рдХрднреА рднреА True рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рдереА ObjectPermissionBackend has_perm рдХреЗ рд▓рд┐рдП рдХрднреА рднреА True рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ user.has_perm(perm, obj) рдХреЛ рдХреЙрд▓ рдЕрднреА рднреА рд╕рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдкрд┐рдд рдмреИрдХрдПрдВрдб рдХреЗ _one_ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИред (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓рдмреИрдХрдПрдВрдб рдЗрд╕ рдЦрд╛рддреЗ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ)

рдареАрдХ рд╣реИ рддреЛ рд╡рд╣ рд╕рдм рджрд┐рдпрд╛ред

рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рд╕рдВрдЧрддрддрд╛ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рдерд╛, рдореИрдВ рднреА contrib.auth рдХреЗ ModelBackend рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрджрд▓рд╛рд╡ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред ModelBackend.has_perm(user_obj, perm, obj=None) рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкрд░рдорд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ 'рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐' рд╣реИ рддреЛ рд╕рд╣реА рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП; рднрд▓реЗ рд╣реА obj рдХреЛрдИ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдЧрддрддрд╛ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдХреЗрд╡рд▓ _backwardsрд╕рдВрдЧрдд_ рд╕рдорд╛рдзрд╛рди рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡реЗ рдпрд╛ рддреЛ API рдореЗрдВ kwarg рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ AUTH рд╕реЗрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ kwargs:
рдЖрдЗрдП рдЗрд╕реЗ obj_shortcut рдХрд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рд▓реЗрдХрд░ рдЖ рд╕рдХрддрд╛ рд╣реВрдВред object_shortcut рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдпрджрд┐ object_shortcut рд╕рддреНрдп рд╣реИ рддреЛ рдмреИрдХрдПрдВрдб рдХреЛ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдЕрдм рдореЙрдбрд▓рдмреИрдХрдПрдВрдб рдХрд░рддрд╛ рд╣реИ: рдЙрдиреНрд╣реЗрдВ _only_ 'рдЯреЗрдмрд▓/рдЧреНрд▓реЛрдмрд▓' рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ obj рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЙрдиреНрд╣реЗрдВ _only_ 'рдкрдВрдХреНрддрд┐/рдСрдмреНрдЬреЗрдХреНрдЯ' рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ object_shortcut рдЧрд▓рдд рд╣реИ рддреЛ рдмреИрдХрдПрдВрдб рдХреЛ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рд╣рдо рджреЛрдиреЛрдВ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ: рд╡реЗ _both_ рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛрдИ рдирд╣реАрдВ рдерд╛ред рдлрд┐рд░ рдЧрд╛рд░реНрдЬрд┐рдпрди рдЬреИрд╕реЗ рдРрдб-рдСрди рд╣рдореЗрд╢рд╛ has_perm рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде object_shortcut=False рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдорд┐рд╢реНрд░рдг рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред user.has_perm(perm, obj, object_shortcut=False) рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЕрдиреБрдорддрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдиреБрдорддрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рд▓реАрдЧреЗрд╕реА рдХреЙрд▓ user.has_perm(perm, obj) рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧреАред

рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ ModelBackend._get_permissions ред

if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
    return set()

рдХреБрдЫ рдРрд╕рд╛ рдмрди рдЬрд╛рдПрдЧрд╛:

if not user_obj.is_active or user_obj.is_anonymous or (obj is not None and legacy_behaviour_setting_is _on):
    return set()

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреНрд▓реАрдирд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ Django рджреЗрд╡ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдПрдХ Django рдмрдЧ рд╣реИ, рдЕрднрд┐рднрд╛рд╡рдХ рдирд╣реАрдВред

@airstandley рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, False рдпрд╛ None рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдЙрди рджреЛрдиреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ ред рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ django рдмреИрдХрдПрдВрдб рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдХрдордЬреЛрд░ рдпреБрдЧреНрдорд┐рддрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХреЗред рдореИрдВ рдХреАрд╡рд░реНрдб рддрд░реНрдХ (рдУрдВ) рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣ рдмрд╛рддрдЪреАрдд рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЦреБрдж рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рдХрд┐ рдЕрднрд┐рднрд╛рд╡рдХ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИ, рдпрд╣ рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореИрдВрдиреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз #546 рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ django рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд┐рдХрдЯ рдмрдирд╛рдпрд╛: https://code.djangoproject.com/ticket/29012 , рдФрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд╣реЗрдВрдЧреЗред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ django рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреНрдп рдЯрд┐рдХрдЯ рдереЗ: https://code.djangoproject.com/ticket/0218

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред

@doganmeh
рдореБрдЭреЗ рд╡рд╣ рджрд┐рд╢рд╛ рдкрд╕рдВрдж рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк #546 рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╛рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдкрд░ред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "Django рдордЬрдмреВрд░ рдмреИрдХрдПрдВрдб" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рднреА рджрд┐рдпрд╛ред рдмреИрдХрдПрдВрдб рдЬреИрд╕рд╛ рдЪрд╛рд╣реЗрдВ рд╡реИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЧрд╛рд░реНрдЬрд┐рдпрди рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯрдкреНрд░рдорд┐рд╢рдирдмреИрдХрдПрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд┐рдВрддрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдСрде рдХреЗ рдореЙрдбрд▓рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЧрд╛рд░реНрдЬрд┐рдпрди рдХрдИ рдмреИрдХрдПрдВрдб рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдХреЛ рдореЙрдбрд▓рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХреЛ рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред (рдЖрдИрдИ рдПрдХ рдЬреЛ рд╕рд┐рд░реНрдл рдЕрднрд┐рднрд╛рд╡рдХ рдХреЗ UserObjectPermission/GroupObjectPermission рдЯреЗрдмрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ UserObjectPermission/GroupObjectPermission рдЯреЗрдмрд▓ рдФрд░ рдСрде рдХреА рдЕрдиреБрдорддрд┐ рддрд╛рд▓рд┐рдХрд╛ рджреЛрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред)
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдФрд░ kwargs рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдмреИрдХрдПрдВрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╢реЙрд░реНрдЯ-рдХрдЯ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреЛрд╕реНрдЯ рдХреЛ Django рджреЗрд╡ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рджреЗрдЦрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпрд╛ рдЕрд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрдВрдЧреЗред рдПрдкреАрдЖрдИ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╕реАрдорд╛ рд╕рд┐рд░реНрдл рдХреНрд▓рдВрдХреА рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╡рд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ

Windows 10 рдХреЗ рд▓рд┐рдП рдореЗрд▓ рд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛

рд╕реЗ: рдПрдпрд░рд╕реНрдЯреИрдВрдбрд▓реА
рднреЗрдЬрд╛ рдЧрдпрд╛: рд╢реБрдХреНрд░рд╡рд╛рд░, рдЬрдирд╡рд░реА 12, 2018 рджреЛрдкрд╣рд░ 12:06 рдмрдЬреЗ
рдкреНрд░рддрд┐: django-рдЕрднрд┐рднрд╛рд╡рдХ/django-рдЕрднрд┐рднрд╛рд╡рдХ
рд╕реАрд╕реА: рдореЗрд╣рдордд рдбреЛрдЧрди; рдЙрд▓реНрд▓реЗрдЦ
рд╡рд┐рд╖рдп: рдкреБрди: [django-guardian/django-guardian] user.has_perm("perm", obj)рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ (#49)

рдкреЛрд╕реНрдЯ рдХреЛ Django рджреЗрд╡ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рджреЗрдЦрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпрд╛ рдЕрд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрдВрдЧреЗред рдПрдкреАрдЖрдИ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╕реАрдорд╛ рд╕рд┐рд░реНрдл рдХреНрд▓рдВрдХреА рд╣реИред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВред

рд▓рдЧрднрдЧ рдПрдХ рд╕рдкреНрддрд╛рд╣ рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЧрд╛рд░реНрдЬрд┐рдпрди рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВред рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Django рдХреЛ obj s рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Django рдХреЛ рдПрдХ рдкреИрдЪ рднреЗрдЬрд╛ рд╣реИ: https://github.com/django/django/pull/9581 (рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ)ред рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЧрд╛рд░реНрдЬрд┐рдпрди рдореЗрдВ рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рдореЙрдбрд▓ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд╕рд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреИрдХрдПрдВрдб рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

lukaszb picture lukaszb  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

g-as picture g-as  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Allan-Nava picture Allan-Nava  ┬╖  35рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

johnthagen picture johnthagen  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BenDevelopment picture BenDevelopment  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ