рдХреБрдЫ рдЙрдкрдпреЛрдЧреА Django рдлрд╝реАрд▓реНрдб

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

рджрд░рдЕрд╕рд▓, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдкрд╣рд▓рд╛ рдХрд╛рдо рдлреЛрдЯреЛ-рд╡реАрдбрд┐рдпреЛ рд╢реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдкрддреНрд░ рд▓реЗрдиреЗ рдХрд╛ рдХрд┐рдпрд╛, рдЬреЛ рджреЛ рдмрд╛рд░ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдореИрдВрдиреЗ Django рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдврд╛рдВрдЪреЗ рдХрд╛ рдореЗрд░рд╛ рдЬреНрдЮрд╛рди рд╡рд┐рднрд╛рдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдерд╛ред рд╕реНрдЯреАрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдЕрдЪрд╛рдирдХ рдХреНрд╖реЗрддреНрд░ рдмрди рдЧрдИ - рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореИрдВ рд╕реМрдВрджрд░реНрдп рд▓рд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ (рджреЛрдиреЛрдВ) рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА - рдлреЛрди рдХрд╛ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╕рдордп рдЪрдпрдиред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рднрд╛рд╖рдгред

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


1) рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
from django.forms import MultiValueField, CharField, ChoiceField, MultiWidget, TextInput, Select 


2) рдлрд┐рд░ рд╣рдо PhoneWidget рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ MultiWidget рд╣реЛрдЧрд╛ред
 class PhoneWidget(MultiWidget): def __init__(self, code_length=3, num_length=7, attrs=None): widgets = [TextInput(attrs={'size': code_length, 'maxlength': code_length}), TextInput(attrs={'size': num_length, 'maxlength': num_length})] super(PhoneWidget, self).__init__(widgets, attrs) def decompress(self, value): if value: return [value.code, value.number] else: return ['', ''] 

рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдФрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рднреА рд░реВрд╕ рдореЗрдВ рд╢рд╣рд░ рдХреЛрдб рдХреА рд▓рдВрдмрд╛рдИ 3 рд╡рд░реНрдг рд╣реИ, рдФрд░ рдлреЛрди рд╕реНрд╡рдпрдВ 7. рд╣реИред рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реНрд╡рдпрдВ 2 рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЖрддреА рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб (рд╕реМрдВрджрд░реНрдп рдХреЗ рд▓рд┐рдП) рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рддреНрд░реБрдЯрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде code_length (рдХреЛрдб рд▓рдВрдмрд╛рдИ) рдФрд░ num_ength (рд╕рдВрдЦреНрдпрд╛ рд▓рдВрдмрд╛рдИ) рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ format_output () рдЬреЛрдбрд╝рд╛
 def format_output(self, rendered_widgets): return '+7' + '(' + rendered_widgets[0] + ') - ' + rendered_widgets[1] 

html рдореЗрдВ рд╕реБрдВрджрд░ рд╕реНрд╡рд░реВрдкрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

3) рдЦреБрдж рдХреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрд╡реИрд▓реНрдпреВрдлрд┐рд▓реНрдб рд╣реЛрдЧрд╛ред
 class PhoneField(MultiValueField): def __init__(self, code_length, num_length, *args, **kwargs): list_fields = [CharField(), CharField()] super(PhoneField, self).__init__(list_fields, widget=PhoneWidget(code_length, num_length), *args, **kwargs) def compress(self, values): return '+7' + values[0] + values[1] #,      

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

4) рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдкреНрд░рдкрддреНрд░ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
 p_num = PhoneField() # \    : PhoneField(code_length=some_value, num_length=some_value) 

рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░
 {{ form.p_num.errors }} <label for="phone_num"> :</label> </br> {{ form.p_num }} 

рд╣рдореЗрдВ 3 рдФрд░ 7 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рджреЛ рд╕реБрдВрджрд░ рдХреНрд╖реЗрддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдпрд╛ рдХрд┐рддрдиреЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ) рд╡рд░реНрдг рдФрд░ рд╕рд╛рдордиреЗ рдПрдХ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдХреЛрдб рдЗрд╕реЗ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред

рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рдПрдХ рд╡рд┐рдЬреЗрдЯ рдФрд░ рд╕рдордп рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
 class TimeWidget(MultiWidget): def __init__(self, h_choices, m_choices, attrs=None): widgets = [Select(choices=h_choices), Select(choices=m_choices)] super(TimeWidget, self).__init__(widgets, attrs) def decompress(self, value): if value: return [value.hours, value.minutes] else: return ['', ''] class TimeField(MultiValueField): def __init__(self, h_choices, m_choices, *args, **kwargs): list_fields = [ChoiceField(), ChoiceField()] super(TimeField, self).__init__(list_fields, widget=TimeWidget(h_choices, m_choices),*args, **kwargs) def compress(self, values): return return values[0] + ':' + values[1] #      datetime 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдЪрд┐рдд рд╕реАрдорд╛ (24 рдФрд░ 60) рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдкрд╕рдВрдж рд╕реЗ 2 рд╕реВрдЪрд┐рдпрд╛рдБ рдмрдирд╛рдИрдВред

рдХреЙрд▓ рдХрд░реЗрдВ:
 time = TimeField(h_choices=HOURS_CHOICES, m_choices=MINUTES_CHOICES) 

рдФрд░ рд╕реНрд╡рдпрдВ рдкреИрд░рд╛рдореАрдЯрд░ (Django рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд╣рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП):
 HOURS_CHOICES = [(str(x), x) for x in range(9, 21)] #      ,     MINUTES_CHOICES = [(1, 0), (2, 10), (3, 20), (4, 30), (5, 40), (6, 50),] #  -  ,  - .     . 



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

UPD: format_output () рд╡рд┐рдзрд┐ рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдл-рд╕реБрдерд░реЗ рд╕реНрд╡рд░реВрдкрдг рдХреЛрд╖реНрдардХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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


All Articles