Skip to content

Instantly share code, notes, and snippets.

@odoku
Created October 29, 2013 03:21
Show Gist options
  • Save odoku/7208744 to your computer and use it in GitHub Desktop.
Save odoku/7208744 to your computer and use it in GitHub Desktop.
DjangoのForm用のフィールドクラス。 ハイフン毎にフィールドを分ける様な電話番号入力の時に使うと良いよ。
#-*-coding=utf8-*-
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.forms.widgets import MultiWidget
class SplitPhoneNumberWidget(MultiWidget):
u"""
電話番号ウィジェット
[te1]-[te2]-[te3]みたいな感じで入力が出来るよ。
"""
def __init__(self, size=None, attrs=None):
self.size = size or (4, 4, 4)
widgets = (forms.TextInput(attrs={'size':self.size[0], 'maxlength':self.size[0]}),
forms.TextInput(attrs={'size':self.size[1], 'maxlength':self.size[1]}),
forms.TextInput(attrs={'size':self.size[2], 'maxlength':self.size[2]}))
super(SplitPhoneNumberWidget, self).__init__(widgets, attrs)
def format_output(self, rendered_widgets):
return '-'.join(rendered_widgets)
def value_from_datadict(self, *args, **kwargs):
values = super(SplitPhoneNumberWidget, self).value_from_datadict(*args, **kwargs)
if any(values):
return u'-'.join(values)
else:
return u''
def decompress(self, value):
if value:
return value.split('-')
return [None for s in self.size]
class SplitHiddenPhoneNumberWidget(SplitPhoneNumberWidget):
"""
hidden表示用、電話番号ウィジェット
"""
is_hidden = True
def __init__(self, *args, **kwargs):
super(SplitHiddenPhoneNumberWidget, self).__init__(*args, **kwargs)
for widget in self.widgets:
widget.input_type = 'hidden'
widget.is_hidden = True
def format_output(self, rendered_widgets):
return ''.join(rendered_widgets)
class PhoneNumberField(forms.RegexField):
u"""
電話番号フォーム
[te1]-[te2]-[te3]みたいな感じの入力を受け付けるよ。
"""
default_error_messages = {
'invalid': _('Invalid phone number.'),
}
def __init__(self, size=None, *args, **kwargs):
self.size = size[0:3] or (4, 4, 4)
widget = kwargs.setdefault('widget', SplitPhoneNumberWidget(self.size))
if isinstance(widget, SplitPhoneNumberWidget):
self.hidden_widget = SplitHiddenPhoneNumberWidget
kwargs['regex'] = ur'\d{2,%d}-\d{2,%d}-\d{2,%d}' % self.size
kwargs['max_length'] = sum(self.size) + len(self.size) - 1
super(PhoneNumberField, self).__init__(*args, **kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment