Created
October 29, 2013 03:21
-
-
Save odoku/7208744 to your computer and use it in GitHub Desktop.
DjangoのForm用のフィールドクラス。
ハイフン毎にフィールドを分ける様な電話番号入力の時に使うと良いよ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#-*-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