рд╣рдореЗрдВ Django рд╕реНрд╡рд╛рдж рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдХреИрдХреНрдЯрд╕ рдЦрд╛рдЯ

Django рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3 рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдХрдИ рд╣рдлреНрддреЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ Django рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд╛рдлреА рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ред рд╕рдВрд╕реНрдХрд░рдг 1.3 рдХрдИ рдмрд╛рд░ 1.7 рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ рд╢рд╛рдЦрд╛ 2 рдореЗрдВ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВред

рдореЗрд░рд╛ рд╡рд╛рдЗрдирдкреИрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ Django 1.3 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдФрд░ рдЕрдм рддрдХ рдпрд╣ Django рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ 12% рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред

рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдпрд╛ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдкрд╛рджрди рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд░реЛрдбрдореИрдк рдФрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдзреАрдореЗ рдмрджрд▓рд╛рд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдореИрдВ рдХреАрдбрд╝реЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рд╢реБрд░реВ рд╕реЗ рд╣реА рдорд╛рдирдХ рдкреНрд░рд╛рдкреНрдд django рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдереАред рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдпрд╛ рддреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдИ рд╡рд╕реНрддреБрдПрдВ рдорд┐рд▓реАрдВ, рдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИред

1 def get(self, *args, **kwargs): 2 clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs) 3 if self.query.can_filter() and not self.query.distinct_fields: 4 clone = clone.order_by() 5 limit = None 6 if not clone.query.select_for_update or connections[clone.db].features.supports_select_for_update_with_limit: 7 limit = MAX_GET_RESULTS 8 clone.query.set_limits(high=limit) 9 num = len(clone) 10 if num == 1: 11 return clone._result_cache[0] 12 if not num: 13 raise self.model.DoesNotExist() 14 raise self.model.MultipleObjectsReturned() 

рдкрдВрдХреНрддрд┐ 9 рдЙрди рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИред

рд╕рдВрд╕реНрдХрд░рдг 3 рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рдереАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХрдИ рдорд┐рд▓рд┐рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ред рдЕрдм рд▓рд╛рдЗрдиреЗрдВ 5,7,8 рд╣реИрдВред рдФрд░ рдЕрдм рдЖрдк рдЧрд░реНрд╡ рд╕реЗ рдХреЗрд╡рд▓ MAX_GET_RESULTS = 21 рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред
рднрд╛рд░реА "__init__" рдХреЗ рд╕рд╛рде рджреЗрд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧреАред рдЗрд▓рд╛рдЬ рдХреИрд╕реЗ рдХрд░реЗрдВ:
Django.db.models.query.py рдореЗрдВ MAX_GET_RESULTS рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ
GET рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ GET рдпрд╛ рдХреЙрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

 vars(queryset.query).update({'high_mark':2, 'low_mark':0})  queryset.query.set_limits(0,2) 

OfInit__ Django рдореЙрдбрд▓ рдХреА рд╡рд┐рдзрд┐


рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ __in__ рдХреЗ рдХреЛрдб рдореЗрдВ рдШреЛрд╖рдгрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ

 _setattr=setattr 

рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕реНрдерд╛рдиреАрдп рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдЫрджреНрдо-рд╕рдЦреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

1. рдпрджрд┐ рдЖрдк __init__ рдореЙрдбрд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛ = рдорд╛рди рдЬреЛрдбрд╝реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ "рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛"ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ __init__ рдкрджреНрдзрддрд┐ рдХреЛ рдмреЛрдЭ рди рдбрд╛рд▓реЗрдВ, рд▓реЗрдХрд┐рди рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП:

 obj = MyClass() vars(obj).update({'attr':val, 'attr2':val2 ...}) 

2. рдирдП Django рдиреЗ рдореЙрдбрд▓ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ (Field.descriptor_class) рдкрд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдПрдХ рднреА рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реАрдлрд╝реИрдЪ_рд░реЗрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬреЛ рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдореИрдВ рдЖрд░рдВрдн рдХреЗ рдЕрдВрдд рдХреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

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

  def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._end_init = True 

рдХреНрд╡реЗрд░реАрд╕рдореВрд╣реЛрдВ


рд╣рд╛рд░реНрдбрдХреЛрдб EmptyQuerySet / DateQuerySet рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдПрдХ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред

рдпрджрд┐ рдореИрдВ рдкреНрд░рдмрдВрдзрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рд╡рд░реНрдЧ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ _queryset_class рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ

 class MyManager(models.Manager): _queryset_class = MyQuerySet 

рдзреНрдпрд╛рди рджреЗрдВ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class MyManager(models.Manager): def get_query_set(self): response = super(MyManager, self).get_query_set() response.__class__ = MyQuerySet return response 

рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓


рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

1. рдорд╛рдирдХ рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЙрддреНрдкрд╛рдж рдХреА рдХреАрдорддреЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЙрд░реНрдоред рдмреАрдЪ рдореЗрдВ "рд╕рдорд╛рди" рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдХ рдЦрд░реАрдж рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЯреИрдмреБрд▓рд┐рдирд▓рд╛рдЗрди рд░реВрдк рдирд┐рд╣рд┐рдд рд╣реИред

рдпрд╣ get_formset рдЗрдирд▓рд╛рдЗрди рдореЙрдбрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдФрд░ BaseInlineFormSet рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЕрдкрдиреА рдЦреБрдж рдХреА MyFormSet рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 def get_formset(self, request, obj=None, **kwargs): kwargs['formset'] = MyFormSet super().get_formset(request, obj, **kwargs) class MyFormSet(BaseInlineFormSet): pass 

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

рдореБрдЭреЗ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ - рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓


Django рдХреА "рд╣рддреНрдпрд╛рд░рд╛ рд╕реБрд╡рд┐рдзрд╛", рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХреИрдХреНрдЯрд╕ рд╣реИ:

1. рдореЙрдбрд▓ рдкреНрд░рд╢рд╛рд╕рдХ рдореЗрдВ "рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛рдПрдВ" рдХрд╛рд░реНрд░рд╡рд╛рдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 admin.site.disable_action('delete_selected') 

2. рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛рдирд╛ рддрдм рддрдХ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдЖрдк рдореЙрдбрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

 from django.contrib.auth.models import Permission class PermissionsAdmin(admin.ModelAdmin): search_fields = ('name', 'codename','content_type__app_label', 'content_type__model') list_display = ('name', 'codename',) actions = None admin.site.register(Permission, PermissionsAdmin) 

3. рдХрд╛рд╢, Django рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде djangoAdminLog рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд▓рд┐рдЦрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 user.logentry_set.filter(action_flag=ENABLED, .....).exists() 

4. рдпрджрд┐ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рд╢рд╛рд╕рдХ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╡реЗ djangoAdminLog рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реИрдВред

5. рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХрд╛ рдПрдХ рдФрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╣реИрдВред рд▓реЗрдХрд┐рди GCBV рдХрд╛ рдХреНрдпрд╛? рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдореЙрдбрд▓ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ GCBV рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрдВрдбрд╛рд░ред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдиреЗрдХреНрд╢рди рдорд╛рдирдХ рд╣реИ:

 class MyAdmin(admin.ModelAdmin): actions = (MyActionBasedOnActionView.as_view(),) 

ContentType - django рдореЙрдбрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА


50% рдкреНрд░рддрд┐рднрд╛ / 50% рдиреАрд░рд╕рддрд╛ред
рдХрд┐рд╕реА рднреА рдореЙрдбрд▓ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЙрдбрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рд╢реНрд░рдг рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 from django.contrib.contenttypes.models import ContentType class ExportMixin(object): @classmethod def ct(cls): if not hasattr(cls, '_ct'): cls._ct, create = ContentType.objects.get_or_create(**cls.get_app_model_dict()) if create: cls._ct.name = cls._ct.model._meta.verbose_name cls._ct.save() return cls._ct @classmethod def get_model_name(cls): if not hasattr(cls, '_model_name'): cls._model_name = cls.__name__.lower() return cls._model_name @classmethod def get_app_name(cls): if not hasattr(cls, '_app_name'): cls._app_name = cls._meta.app_label.lower() return cls._app_name @classmethod def get_app_model_dict(cls): if not hasattr(cls, '_format_kwargs'): cls._format_kwargs = {'app_label': cls.get_app_name(), 'model': cls.get_model_name()} return cls._format_kwargs 

рдЕрдм рд╣рдо рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ obj.ct () рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

UserModel


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.5 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред

рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3 рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдирдХ UserCreationForm / UserChangeForm рдореЗрдВ рдореЙрдбрд▓ = рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import get_user_model class MyUserCreationForm(UserCreationForm): class Meta: model= get_user_model() 

рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдгрд╛рд▓реА


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВ

 {% trans %} 

рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдореЗрдВ

 gettext_lazy 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдХреЛрдИ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ред

рдмрд╛рд╣рд░реА рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд╡реЗ рд╕рднреА рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЛрд╕реЗрдЯрд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рда рдЦреЛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд╣реАрдВ рднреА рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд┐рдд makemessages / compilemessages рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ...

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

рдмрд╣реБрднрд╛рд╖рд╛рд╡рд╛рдж рдХрд╛ рд╡рд┐рд╖рдп рдЖрдо рддреМрд░ рдкрд░ рдЬрдЯрд┐рд▓ рд╣реИред Django рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдкрд╛рдареЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЗрди рдореЙрдбрд▓реЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ django-TOF рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкрд╛рдареЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдореЙрдбрд▓-рдЕрдиреБрд╡рд╛рдж рдФрд░ Parler / Hvad рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЭрд╛рдВрдХрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдерд╛ рдХреЛ рд░реЛрдХ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Django рдмрдЧ рдлрд┐рдХреНрд╕ рд▓реЗрдЦ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд▓реЙрдиреНрдЧреНрд░реЗрдб рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ Django рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВред

ps рдХреБрдЫ рдХреЛрдб рдкреБрд░рд╛рдиреА рд╕рдВрдХреЗрддрди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдордп рдпрд╛ рд╕реНрдЯрд╛рдл рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi481042/


All Articles