рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рджреГрд╢реНрдп рд╣реИ, AccountList
, рдЬреЛ рдПрдХ django_table2 рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред рджреГрд╢реНрдп рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:
class AccountList(SingleTableMixin, FilterView):
model = Account
table_class = AccountTable
template_name = 'accounts/account_list.html'
context_table_name = 'object_list'
ordering = ['vps']
filterset_class = AccountFilter
рдпрд╣ рджреГрд╢реНрдп рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ (django_filters рд╕реЗ):
import django_filters
from accounts.models import Account
class AccountFilter(django_filters.FilterSet):
class Meta:
model = Account
fields = ['is_suspended', 'is_abandoned']
is_suspended = django_filters.BooleanFilter(name='is_suspended', initial='False')
is_abandoned = django_filters.BooleanFilter(name='is_abandoned', initial='False')
def __init__(self, data=None, *args, **kwargs):
# if filterset is bound, use initial values as defaults
if data is not None:
# get a mutable copy of the QueryDict
data = data.copy()
for name, f in self.base_filters.items():
initial = f.extra.get('initial')
# filter param is either missing or empty, use initial as default
if not data.get(name) and initial:
data[name] = initial
super().__init__(data, *args, **kwargs)
рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
{% if filter %}
<form action="" method="get" class="form form-inline">
{{ filter.form.as_p }}
<input type="submit" />
</form>
{% endif %}
{% render_table object_list %}
{% endblock %}
рдпрд╣ рдореЗрд░реЗ urls.py . рд╕реЗ рд╣реИ
path('', login_required(AccountList.as_view())),
рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдкреГрд╖реНрда 127.0.0.1:8000
рд╣реВрдВ, рддреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ:
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдЧрд░ рдореИрдВ 127.0.0.1:8000?page=1
рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдареАрдХ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдП рдЧрдП рд╣реИрдВ:
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди 'False'
рдмрдЬрд╛рдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ False
рдмреВрд▓рд┐рдпрди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рддреЛ рдЬрдм рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
is_suspended = django_filters.BooleanFilter(name='is_suspended', initial=False)
is_abandoned = django_filters.BooleanFilter(name='is_abandoned', initial=False)
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд╝рд┐рд▓реНрдЯрд░ 127.0.0.1:8000/
рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
рднрд▓реЗ рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд╣реА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рднреА рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдирд┐рд▓рдВрдмрд┐рдд рдпрд╛ рдЫреЛрдбрд╝реЗ рдЧрдП рдЦрд╛рддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдореИрдВ рдиреАрдЪреЗ 2
рдмрдЯрди рджрдмрд╛рдХрд░ рдкреГрд╖реНрда 2 рдкрд░ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ http://127.0.0.1:8000/?page=2
рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ Unknown
рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдХрд╛рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ - рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рджрд┐рдорд╛рдЧ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд░рд┐рдгрд╛рдореА SQL рдХреНрд╡реЗрд░реА рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ suspended
рдФрд░ abandoned
рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рджреВрд╕рд░реЗ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдмрджрд▓рддреЗ рд╕рдордп suspended
рдФрд░ abandoned
рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред
рдореИрдВрдиреЗ рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдбрд╛рд▓реЗ рдФрд░ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓реЗ:
def __init__(self, data=None, *args, **kwargs):
if data is not None: # 1
data = data.copy()
for name, f in self.base_filters.items():
initial = f.extra.get('initial')
# filter param is either missing or empty, use initial as default
if not data.get(name) and initial:
data[name] = initial
super(BaseFilterSet, self).__init__(data, *args, **kwargs)
рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ data
рд╣реИ None
ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рд╡рд░реНрдЧ рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдп data
рд╕реЗ AccountFilter
рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
рд╣рдореНрдоред data
рддрд░реНрдХ рд╣рдореЗрд╢рд╛ FilterView
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрдпрд╛ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рджреЛрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП data
рдЦрд╛рд▓реА рд╣реИ?
рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред
2.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП URL рдореЗрдВ рдпрд╛ рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреГрд╖реНрда рдпрд╛ рдЦрд╛рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ?
рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...
page
? рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ, рдмрдЬрд╛рдп Django рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? 2.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред 1.1.0 рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреГрд╢реНрдп рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@moorchegue , рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред
рдРрд╕рд╛ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдЖрдкрдХреЗ рдкреЗрдЬрд┐рдиреЗрд╢рди рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рд╛рдВ, рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрд╕рдВрдЧрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Django рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдПрдХ рдмрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ #788 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ is_valid()
рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде рд╣реИред
рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ False
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрдм data
None
ред
рдЙрд╕ рджреГрд╢реНрдп рдореЗрдВ рд╣рдо рдлрд┐рд░ object_list
рд╕реЗ qs.none()
ред
рдЗрд╕рд▓рд┐рдП рдордирд╛рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЯреЗрдореНрдкреНрд▓реЗрдЯ filter.qs
рдмрдЬрд╛рдп object_list
ред
рддрддреНрдХрд╛рд▓ рдХрд╛рдо рдЖрдкрдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдкрд░ strict = False
рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдорд╛рдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЦрд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдВрд╢рд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдмреЗрд╣рддрд░ рд╣реИ рджреГрд╢реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ get
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрд░реНрдХ ...)
рд╣рдо рдЕрдирдмрд╛рдЙрдВрдб рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╣рдореНрдоред рдпрд╣рд╛рдВ рдкреНрд░рд╛рдердорд┐рдХ рдХрдореА рджреГрд╢реНрдп рдХреЗ object_list
рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЗ .qs
рдмреАрдЪ рдЕрд╕рдорд╛рдирддрд╛ рд╣реИред рд╕рдЦреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ FilterSet.qs
рд╡рд╣ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдбреАрдЖрд░рдПрдл рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдЦреНрдд/рдЧреИрд░-рд╕рдЦреНрдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЗрд╕реЗ рдорд┐рдЯрд╛ рджреВрдВрдЧрд╛ред
@rpkilby рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?
рд╣рд╛рдВ - рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рдкрдбрд╝рд╛ред рдЬрд╣рд╛рдВ рд╕реЗ рдореИрдВрдиреЗ рдХрд╛рдлреА рдЬрд▓реНрджреА рдЫреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣рд╛рдВ рд╕реЗ рдореИрдВ рдЙрдард╛ рд╕рдХреВрдВрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП strict = False
рдЕрдкрдиреЗ рдкрд░ FilterMixin
рд╡рдВрд╢рдЬ (рд╢рд╛рдпрдж View
ред
рдХреНрдпрд╛ рдЖрдк рдЕрдирдмрд╛рдЙрдВрдб рдлреЙрд░реНрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ qs рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рд╢рд░реНрдд рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ?
рдЬреИрд╕реЗ
- if self.filterset.is_valid() or not self.get_strict():
+ if not self.filterset.is_bound or self.filterset.is_valid() or not self.get_strict():
https://github.com/carlongibson/django-filter/pull/1007
рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдВ - рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рдкрдбрд╝рд╛ред рдЬрд╣рд╛рдВ рд╕реЗ рдореИрдВрдиреЗ рдХрд╛рдлреА рдЬрд▓реНрджреА рдЫреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣рд╛рдВ рд╕реЗ рдореИрдВ рдЙрдард╛ рд╕рдХреВрдВрдЧрд╛ред